建立自己的CA,签署自己的服务器证书,配置自己的https站点

一、目标

从头开始配置一个自己的https站点,并让本机浏览器信任站点。

二、商用步骤

1. 创建自己的私钥

2. 创建CSR(Cerificate Signing Request)

3. 发送CSR给CA,获取证书文件

4. 部署私钥和证书文件到服务器端,完成https站点的配置。

三、实验步骤

由于CA签署证书文件需要一定的条件(时间,金钱),在实验阶段不太切合实际。所以实验或者测试过程中一般都是搭建自己的CA,用自己的CA签署证书。步骤如下:

1. 创建自己的CA

2. 创建测试用的私钥

3. 创建CSR

4. 用自己的CA签署CSR获取证书文件

5. 部署私钥和证书文件到服务器端,完成https站点的配置。

接下来我就按照试验步骤来详细讲解。

四、创建自己的CA

在这里我们用openssl作为创建CA的工具。由于我的系统是windows的,所以就用cygwin自带的openssl演示,如果是linux系统一般都默认安装了openssl,直接使用即可。

1. 首先我们新建一个目录root-ca

2. 切换到这个目录

    cd root-ca

3.在目录下创建一个文本文件root-ca.conf 内容如下:

[default]
name                    = root-ca
domain_suffix           = example.com
aia_url                 = http://$name.$domain_suffix/$name.crt
crl_url                 = http://$name.$domain_suffix/$name.crl
ocsp_url                = http://ocsp.$name.$domain_suffix:9080
default_ca              = ca_default
name_opt                = utf8,esc_ctrl,multiline,lname,align

[ca_dn]
countryName             = "CN"
organizationName        = "Example"
commonName              = "Root CA"

[ca_default]
home                    = .
database                = $home/db/index
serial                  = $home/db/serial
crlnumber               = $home/db/crlnumber
certificate             = $home/$name.crt
private_key             = $home/private/$name.key
RANDFILE                = $home/private/random
new_certs_dir           = $home/certs
unique_subject          = no
copy_extensions         = none
default_days            = 3650
default_crl_days        = 365
default_md              = sha256
policy                  = policy_c_o_match

[policy_c_o_match]
countryName             = match
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[req]
default_bits            = 4096
encrypt_key             = yes
default_md              = sha256
utf8                    = yes
string_mask             = utf8only
prompt                  = no
distinguished_name      = ca_dn
req_extensions          = ca_ext

[ca_ext]
basicConstraints        = critical,CA:true
keyUsage                = critical,keyCertSign,cRLSign
subjectKeyIdentifier    = hash

[sub_ca_ext]
authorityInfoAccess     = @issuer_info
authorityKeyIdentifier  = keyid:always
basicConstraints        = critical,CA:true,pathlen:0
crlDistributionPoints   = @crl_info
extendedKeyUsage        = clientAuth,serverAuth
keyUsage                = critical,keyCertSign,cRLSign
nameConstraints         = @name_constraints
subjectKeyIdentifier    = hash

[crl_info]
URI.0                   = $crl_url

[issuer_info]
caIssuers;URI.0         = $aia_url
OCSP;URI.0              = $ocsp_url

[name_constraints]
permitted;DNS.0=example.com
permitted;DNS.1=example.org
excluded;IP.0=0.0.0.0/0.0.0.0
excluded;IP.1=0:0:0:0:0:0:0:0/0:0:0:0:0:0:0:0

[server_ext]
authorityInfoAccess     = @issuer_info
authorityKeyIdentifier  = keyid:always
basicConstraints        = critical,CA:false
crlDistributionPoints   = @crl_info
extendedKeyUsage        = clientAuth,serverAuth
keyUsage                = critical,digitalSignature,keyEncipherment
subjectKeyIdentifier    = hash
subjectAltName = DNS:www.example.com,DNS:example.com
#特别说明,如果你的机器没有域名,就用你的机器名代替这里的exmaple.com
#在浏览器访问的时候也不要用localhost或者ip地址,直接用机器名,要不然证书不会识别成功

[client_ext]
authorityInfoAccess     = @issuer_info
authorityKeyIdentifier  = keyid:always
basicConstraints        = critical,CA:false
crlDistributionPoints   = @crl_info
extendedKeyUsage        = clientAuth
keyUsage                = critical,digitalSignature
subjectKeyIdentifier    = hash

4.执行下面一系列命令,创建相关的文件夹和文件

mkdir certs db private
touch db/index
openssl rand -hex 16  > db/serial
echo 1001 > db/crlnumber

5.开始创建CA

openssl req -new  -config root-ca.conf -out root-ca.csr -keyout private/root-ca.key

6.签署CA根证书

openssl ca -selfsign -config root-ca.conf -in root-ca.csr -out root-ca.crt -extensions ca_ext

7.将我们自己的根证书安装到系统中,windows系统可以直接双击root-ca.crt文件进行安装,安装时要注意选择安装证书到信任的根证书栏目内。如下图所示:

8.至此,我们就建立好了自己的CA了,并让自己的系统信任了这个CA,也就是说只要是这个CA颁发的证书或者这个CA的子CA颁发的证书都会被我们的系统信任。特别提醒,根证书是整个信任链的最后堡垒,所以除非你能确保这个根证书绝对值得信任,否则绝对不能安装到授信任的根证书列表里。

 

五、创建服务器私钥、CSR,并用自己的CA颁发服务器证书

1. 新建一个目录server 并切换到server目录,新建一个文本文件server.conf,内容如下:

[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = 12345678

[dn]
CN = www.example.com
emailAddress = [email protected]
O = Example Ltd
L = NJ
C = CN

[ext]
subjectAltName = DNS:www.example.com,DNS:example.com
#特别说明,如果你的机器没有域名,就用你的机器名代替这里的exmaple.com
#在浏览器访问的时候也不要用localhost或者ip地址,直接用机器名,要不然证书不会识别成功

2. 创建服务器私钥

openssl genrsa -aes128 -out server-key.pem 2048

3. 创建服务器证书的CSR

 

openssl req -new -config server.conf -key server-key.pem -out server.csr

4. 用自己的CA签署这个证书

cd ..\root-ca
openssl ca -config root-ca.conf -in ..\server\server.csr -out ..\server\server.crt -extensions server_ext

5. 至此我们的服务器私钥以及证书创建完成。

 

六、搭建并测试我们的HTTPS站点

http服务器有很多种,每种在配置https访问时用到证书和私钥格式都不尽相同。这里选取tomcat7作为我们的目标服务器来演示。

1. 转换我们的私钥以及证书格式

由pem格式转成pkcs12格式

openssl pkcs12 -export -in ..\server\server.crt -inkey ..\server\server-key.pem -out server.pk12 -name server

2. 修改tomcat配置文件conf\server.xml,加入如下connector:

    <Connector port="8443"  protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile=".\jks\server.pk12"
 keystorePass="12345678"  ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA
" />

3.启动tomcat

4.从浏览器访问,这时可以看到浏览器已经识别服务器证书了,这是因为我们的root证书已经加入系统信任列表

今天很晚了,明天有空我就接着整理客户端证书和客户端验证的例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章