前言
请参考:
【HTTPS】自签CA证书 && nginx配置https服务
抄录如下:
OpenSSL具体安装及使用此文中不再累赘,请参考网上相关文档。
首先生成X509格式的CA自签名证书
$openssl req -new -x509 -keyout myca.key -out myca.crt –days 90
生成SSL客户端的私钥(key文件)及csr文件
$openssl genrsa -des3 -out SSL.key 1024 –days 90
$openssl req -new -key SSL.key -out SSL.csr –days 90
用生成的CA的证书为刚才生成的SSL.csr文件签名
$openssl ca -in SSL.csr -out SSL.crt -cert myca.crt -keyfile myca.key –days 90
生成p12格式证书
$openssl pkcs12 -export -inkey SSL.key -in SSL.crt -out SSL.pfx
完成以上操作后在当前目录下会有六个文件,分别是myca.crt,myca.key,SSL.crt,SSL.csr,SSL.key,SSL.pfx。其中CA的公钥myca.crt 和用户的私钥 SSL.pfx是我们需要的文件。
如果在这步出现错误信息:
[weigw@TEST bin]$ openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
Using configuration from /usr/share/ssl/openssl.cnf I am unable to access the ./demoCA/newcerts directory ./demoCA/newcerts: No such file or directory
[weigw@TEST bin]$
自己手动创建一个CA目录结构:
[weigw@TEST bin]$ mkdir ./demoCA
[weigw@TEST bin]$ mkdir demoCA/newcerts
创建个空文件:
[weigw@TEST bin]$ vi demoCA/index.txt
创建文件:
[weigw@TEST bin]$ vi demoCA/serial
向文件中写入01
并且第二行空一行
openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
基本概念
KEY 通常指私钥。
CSR 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
CRT 即 certificate的缩写,即证书。
X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.
Apache和*NIX服务器偏向于使用这种编码格式.
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
Java和Windows服务器偏向于使用这种编码格式
OpenSSL 相当于SSL的一个实现,如果把SSL规范看成OO中的接口,那么OpenSSL则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是OpenSSL中的一个bug.
key 私钥,csr 公钥,crt 证书
过程
首先,我们要先新建一个 文件目录:
mkdir -p /etc/pki/CA/
cd /etc/pki/CA/
为什么偏要这个目录??额,我也不知道不过,
这个目录想必是openssl默认位置了。放在一起方便点吧。
注意,1024位已经不安全了啊,现在要2048了,请参考:
所以我们认真输入:
openssl genrsa -des3 -out ca.key 2048
顺便填写密码:
然后,生成crt–公钥。
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
顺便填写一些信息:
请参考:
openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?
common name应该要填你的域名,下面这位兄弟也遇到:
解决自建ca认证后浏览器警告
好了,我们本地测试,先记着,
已经成功生成了私钥key以及CA公钥即CA根证书,然后,
生成HTTPS证书私钥
openssl genrsa -des3 -out server.pem 2048
生成签名请求
openssl req -new -key server.pem -out server.csr
注意,最后会问你
A challenge password ?
意思是;
好了,自行设置以后:
成功生成 csr—公钥,也是证书签名请求文件。
用CA进行签名
-- openssl ca -policy policy_anything -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out ca.crt
这里犯了一个很严重的问题!-out xxx.crt 是目标文件,不要让他覆盖 原本的 ca.crt!!!
openssl ca -policy policy_anything -days 3650 -cert ca.crt -keyfile ca.key -in server.csr -out wangwangwang.crt
然后,问题1出现:
ca: ./demoCA/newcerts is not a directory
./demoCA/newcerts: No such file or directory
解决方案:
于是:
mkdir -p demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
echo '01'>demoCA/serial
然后继续执行:
注意!!!
这里犯了一个很严重的问题!-out xxx.crt 是目标文件,不要让他覆盖 原本的 ca.crt!!!
于是勤奋的lz重新做了一次,然后终于得到我们的重要目标文件了:
nginx配置https
好了,刚才生成的crt以及pem分别是:
/etc/pki/CA/wangwangwang.crt
/etc/pki/CA/server.pem
然后我们主要修改这些内容:
server {
listen 80;
listen 443 ssl;
#server_name zou.lu;
#root /var/www/html;
#ssl on; //这行必须要注释掉
ssl_certificate /etc/pki/CA/wangwangwang.crt;
ssl_certificate_key /etc/pki/CA/server.pem;
}
修改为:
重启:
nginx -s reload
额。。竟然要输入密码,太不方便了!!!
好,我们输入密码试试。
访问主页:
http形式:
https方式:
无法访问。。
不可能,我们一步一步按照网上教程来做,于是重启一下看看:
好,问题出现了:
SSL_CTX_use_PrivateKey_file("/etc/pki/CA/server.pem") failed (SSL: error:2807106B:UI routines:UI_proces
h好了,我们改改:
openssl rsa -in ca.key -out no-pwd-ca.key
然后,更名:
mv ca.key ca-with-pwd.key
mv no-pwd-ca.key ca.key
重启:
额。。不行,所以,还是正正经经再来一个crt证书算了。
证书重制
#创建新的ca证书,用于本地测试用,全部都放到/etc/pki/CA/localhost这个目录下面去。
mkdir -p /etc/pki/CA/localhost
cd /etc/pki/CA/localhost
我们最后还是要放到nginx下面做证书的,不能有密码,所以,我们生成一个没有密码的ca私钥:
openssl genrsa -out ca-no-pwd.key 2048
生成crt
openssl req -new -x509 -days 3650 -key ca-no-pwd.key -out ca.crt