一、目标
从头开始配置一个自己的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证书已经加入系统信任列表
今天很晚了,明天有空我就接着整理客户端证书和客户端验证的例子。