0. 前期准备工作
1 2 3 4 5 6 7 8 9 |
cd ~/ mkdir ssl cd ssl mkdir demoCA cd demoCA mkdir newcerts mkdir private touch index.txt echo '01' > serial |
1. 制件 CA 证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 生成 CA 私钥: ca.key openssl genrsa -des3 -out ca.pem 2048 # 这样是生成 rsa 私钥,`des3` 算法,openssl 格式,2048 位强度。`ca.key` 是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。 # 生成没有密码的key: openssl rsa -in ca.pem -out ca.key # X.509 Certificate Signing Request (CSR) Management. openssl req -new -key ca.key -out ca.csr # openssl req -new -out ca.csr -key ca.key -keyform PEM # X.509 Certificate Data Management.生成 CA 根证书的公钥 ca.crt. openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt # openssl req -new -x509 -days 3650 -key ca.key -out ca.crt # 生成 CER # openssl x509 -req -in ca.csr -out ca.cer -signkey ca.key -CAcreateserial -days 3650 # 生成 P12 # openssl pkcs12 -export -clcerts -in ca.cer -inkey ca.key -out ca.p12 |
2. 制作网站的 https 证书,并用 CA 签名认证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 假设我们需要为 abc.com 域名制作证书,先生成 abc.com 的证书私钥 abc.com.pem openssl genrsa -des3 -out abc.com.pem 1024 # 无密码的私钥 openssl rsa -in abc.com.pem -out abc.com.key # 生成 csr 签名请求 openssl req -new -key abc.com.pem -out abc.com.csr # 这里需要输入国家,地区,组织,email等。最重要的是 **common name**,可以写你的名字或者域名。如果为了 https 申请,这个必须和域名一样,即,这里要写 abc.com,否则会引发浏览器警报,这里可以用 *.abc.com 来做泛域名证书。 # 最后,需要用 CA 证书进行签名: openssl ca -policy policy_anything -days 3650 -cert ./demoCA/ca.crt -keyfile ./demoCA/ca.key -in abc.com.csr -out abc.com.crt #openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in abc.com.csr -out abc.com.crt # 生成 cer openssl x509 -in abc.com.crt -out abc.com.cer -outform der #openssl x509 -req -in abc.com.csr -out abc.com.cer -signkey abc.com.key -CA ./demoCA/ca.cer -CAkey ./demoCA/ca.key -CAcreateserial -days 3650 # 生成 p12 openssl pkcs12 -export -clcerts -inkey abc.com.key -in abc.com.cer -out abc.com.p12 # 生成服务器端公钥 openssl rsa -in server.key -pubout -out server.pem |
这样网站的 https 证书就做完了。
还有一步就是把 ca.crt 的内容追加到 abc.com.crt 后面,因为有些浏览似乎不支持。
cat demoCA/ca.crt >> abc.com.crt
其实很多时候,并不需要加密的 key,所以像这面这么做就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cd ~/ mkdir ssl cd ssl mkdir demoCA cd demoCA mkdir newcerts mkdir private touch index.txt echo '01' > serial openssl genrsa -out ca.key 2048 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt cd .. openssl genrsa -out abc.com.key 2048 openssl req -new -key abc.com.key -out abc.com.csr openssl ca -policy policy_anything -days 1460 -in abc.com.csr -out abc.com.crt -cert ./demoCA/ca.crt -keyfile ./demoCA/ca.key |
3. 其他方式
1 2 3 4 5 6 7 8 9 10 11 12 |
# 生成crt证书文件 openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt # openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf # 这里365是证书有效期 推荐3650哈哈。这个大家随意。最后使用到的文件是key和crt文件。 # 如果需要用pfx 可以用以下命令生成 openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx # 用生成的CA的证书生成服务端和客户端的server.csr,client.csr文件签名: openssl ca -in server.csr -out server.crt -cert ssl.crt -keyfile ssl.key # 生成cer openssl x509 -inform pem -in ssl.crt -outform der -out ssl.cer # 获取cer openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer |
nginx 配置
加入配置内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
server { listen 443; server_name abc.com www.abc.com; root html; index index.html index.htm; ssl on; ssl_certificate /PATH/TO/abc.com.crt; ssl_certificate_key /PATH/TO/abc.com.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; ssl_prefer_server_ciphers on; location / { try_files $uri $uri/ =404; } } |
# 在需要使用证书的nginx配置文件的server节点里加入以下配置就可以了。
1 2 3 4 5 6 7 |
ssl on; ssl_certificate /home/ssl.crt; ssl_certificate_key /home/ssl.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; |
# 然后重启nginx就大功告成了