我们需要证书时,有两种方式获得,一种是向CA证书颁发机构申请,另一种就是自己做CA证书颁发机构,自己给颁发证书。
向CA证书颁发机构申请证书
需要先生成“证书请求”文件(后缀大多为.csr),这个文件中包含你的名字和公钥。然后将此证书请求文件交给诸如verisign等提供CA服务的公司(当然要连同几百美元)。证书请求经验证后,CA机构用它的私钥签名,形成合法的证书发给你。你在web服务器上导入这个证书就行了。为啥它们颁发的证书才是合法的,因为浏览器和操作系统已经把这些CA根证书预置到了电脑里,所以浏览器认为使用了这些CA机构颁发的证书的网站是安全的,地址栏上有个小锁标志。
自颁发证书
在组织内网使用,为节省费用,组织一般自己做CA,自己给自己颁发证书。为了让组织内的电脑认为自颁发的证书是合法的,就需要把这个CA根证书内植入组织内的每台电脑中,告诉电脑这个CA是受信任的颁发机构。基本步骤为:先配置CA的私钥和公钥,私钥保存,自签CA,公钥可以公开。当组织内需要证书时,将生成证书请求提交给组织的CA进行签发。
这里讲一下如何自签发证书:
一、知识介绍
介绍两种常见加密算法
- AES 对称加密
加密和解密使用同一个密钥。
优点:加密快、方便;
缺点:密钥容易被偷,或被破解。
常见的对称加密算法还有:DES、3DES、Blowfish、RC2以及国密的SM4。 - RSA 非对称加密
密钥分为两个:公钥和私钥。公钥发给对方,可以公开,私钥自己保管。用公钥加密的数据只能用私钥打开 。
常见的非对称加密算法还有:Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)以及国家商用密码SM2算法。
两种证书编码
- der
二进制der编码的证书,这些证书也可以用.cer或.crt作为扩展名。
比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”。 - .PEM
X.509 v3 证书。文件内容由"—– BEGIN …“开始的ASCII(Base64)数据。
常见几种扩展名文件
- .key:私钥。可以是DER编码或者PEM编码。通常是rsa算法。
- .csr :证书请求文件,用于申请证书。
- .crt:证书文件。可以是DER编码,也可以是PEM编码。
- .cer:crt证书的微软形式。可以用微软的工具把crt文件转换为cer文件(crt和cer必须是相同编码类型,要么是der,要么是pem)
- .pem:证书文件。也代表证书的编码类型。
windows版的OpenSSL,下载地址:http://slproweb.com/products/Win64OpenSSL.html,安装完openssl后,添加系统环境变量C:\OpenSSL-Win64\bin。
MAC系统自带OpenSSL,不需要再安装。
二、实例
使用openssl自签发一个CA根证书,然后用这个根证书签发一个通配符证书,以下为操作步骤:
注意:openssl命令中,多一个空格,少一个空格都会造成命令出错。参数的短横线也要注意。
第一步 生成根证书
1、生成根证书私钥
生成无密码的私钥:
先在用户目录下建立一个ssl目录,用来存放生成的文件
openssl genrsa -out ssl/ca.key 2048
2、生成证书请求文件
据私钥生成证书请求文件
openssl req -new -key ssl/ca.key -out ssl/ca.csr
会提示输入以下内容:
假设你的域名为123.com,除了Commn name要和你的域名有关以外,其它随便输入即可。
国家(CN)、地区(BJ)、组织(helloworld)、部门(ca)、Common name(ca.123.com),email(dd@dd.com)。
3、自签发根证书
openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey ssl/ca.key -in ssl/ca.csr -out ssl/ca.crt
至此,~/ssl/目录中应该生成了三个文件:ca.csr、ca.crt、ca.key
第二步 用根证书签发一个通配符证书
1、生成一个证书私钥
openssl genrsa -out ssl/server1.key 2048
注意:生成的文件名是server1.key,而不是server1.key 2048,如果是后者,需要检查一下命令格式(把2048前面的空格,删除,重新输入空格,再执行命令)
2、生成证书请求文件
openssl req -new -key ssl/server1.key -out ssl/server1.csr
这一步中的Common name要写成通配符形式,如*.123.com,这样这个域名的其它子域名都可以用这一个证书了。
3、使用根证书签发这个证书
openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA ssl/ca.crt -CAkey ssl/ca.key -CAserial ca.srl -CAcreateserial -in ssl/server1.csr -out ssl/server1.crt
如果需要的是pfx格式(一般windows需要这种格式)的证书,使用以下命令进行合成(需要上面生成的私钥.key文件和服务器证书.crt文件):
openssl pkcs12 -export -out ssl/server1.pfx -inkey ssl/server1.key -in ssl/server1.crt
至此,我们已经使用openssl自签发了一个CA证书,并用CA证书签发了一个通配符证书。下一步,我们把它部署到nginx上。
在~/ssl/目录下,又生成了四个文件:server1.pem、server1.csr、server1.crt、server1.key
nginx反向代理https后端服务器
一般而言,网站与用户之间如果使用了nginx反向代理,只需要在用户访问nginx启用https即可,nginx到web服务器是https还是http不重要。
如果nginx到web服务器之间也需要https通信,则参照以下描述:
- 用户通过https访问nignx(这里需要在nginx上部署合法的证书)
- nginx通过https反向代理到web服务器(这里用自签发的证书即可)
- web服务器启用https(可以是web服务器自身启用https,也可以再架设一台内网nginx服务器,外网nginx到内网nginx启用https,内网nginx到web服务器仍保持http)
在nginx服务器上建立以下目录(建议):
- /etc/letsencrypt/live/XXXX.com/
存放let's encrypt生成的合法的证书: - 以下目录存放自签发的证书:
/etc/certs/ca.cert
/etc/certs/*.xxxx.com/*.xxx.com.crt
/etc/certs/*.xxxx.com/*.xxx.com.key
nginx主要配置如下:
server {
server_name XXXX;
add_header Strict-Transport-Security "max-age=31536000";
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/XXXX.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXX.com/privkey.pem;
location / {
proxy_pass https://XXXX$request_uri;
proxy_ssl_certificate /etc/certs/*.xxxx.com/*.xxxx.com.crt;
proxy_ssl_certificate_key /etc/certs/*.xxxx.com/*.xxxx.com.key;
proxy_ssl_trusted_certificate /etc/certs/ca.crt;
proxy_ssl_verify off;
proxy_ssl_session_reuse on;
proxy_ssl_verify_depth 2;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_pass_header Set-Cookie;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
附:证书转换命令:
.key 转换成 .pem:
openssl rsa -in ssl/ca.key -out ssl/ca.pem
.crt 转换成 .pem:
openssl x509 -in ssl/ca.crt -out ssl/ca.pem
倒过来转换:
.pem转换成.key
openssl rsa -in ssl/ca.pem -out ssl/ca.key
.pem转换成.crt
openssl x509 -in ssl/ca.pem -out ssl/ca.crt