openssl生成自制证书并配置nginx实现https双向认证

2018-01-17  本文已影响0人  亦德

实验环境

我使用的环境是centos7最小化安装。
看标题就知道需要使用到openssl这个软件,可以确认一下你的电脑是否进行了安装,如果没有安装,可以运行yum install openssl -y进行安装。
当然,自制的证书————,其实并不是不安全,只不过没有花钱购买的证书安全度高,如果是特定用途的话,还是花钱进行购买商业证书为好。如果你说你没有那么多钱,那么你多半也不需要那么高的安全加密程度。

名词解析

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

认证过程

单向认证

只需要验证SSL服务器身份,不需要验证SSL客户端身份。


单向认证.png

双向认证

要求服务器和客户端双方都有证书,客户端需要校验服务端,服务端也需要校验客户端。


双向认证.png

自制证书

CA证书

创建私钥

输入以下命令

openssl genrsa -out ca-key.pem 1024

创建csr证书请求

输入以下命令创建csr证书,如果没有-subj参数,则需要手动输入需要的参数,此时可以看见相应的提示。
-subj 中参数的含义:

参数 意义
C 国家
ST
L 本地名称
O 组织名称
OU 组织单元名称
CN 命令名称
openssl req -new -key ca-key.pem -out ca-req.csr -subj "/C=CN/ST=BJ/L=BJ/O=fish/OU=fish/CN=CA"

除去密码

在加载SSL支持的Nginx并使用上述私钥时必须除去口令,否则会在启动nginx的时候输入密码。
去除口令,在命令行中执行此命令: openssl rsa -in ca-key.pem -out ca.key
以上这一段是因为如果生成私钥的时候加入-des3参数的时候会有密码输入的过程,而这个密码会在重启nginx的时候需要输入

生成crt证书

执行以下命令生成CA证书

openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey ca-key.pem -days 3650

服务器端证书

创建服务器端私钥

输入以下命令

openssl genrsa -out server-key.pem 1024

创建csr证书

输入以下命令创建csr证书,其中-subj参数与CA证书的csr命令含义相同。

openssl req -new -out server-req.csr -key server-key.pem -subj "/C=CN/ST=BJ/L=BJ/O=fish/OU=fish/CN=*.fish-test.com"

其中输入的信息中最重要的为 CN,这里输入的域名即为我们要使用https访问的域名。同时也可以使用泛域名如.webkaka.com来生成所有二级域名可用的网站证书。*

生成crt证书

执行以下命令生成服务器端证书

openssl x509 -req -in server-req.csr -out server-cert.pem -signkey server-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650

用CA进行签名
openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in www.webkaka.com.csr -out www.webkaka.com.crt

确认证书

openssl verify -CAfile ca-cert.pem  server-cert.pem

有了以上的文件之后就可以配置单向认证访问了,如果需要双向认证,还需要以下的操作。

客户端证书端证书

创建客户端私钥

输入以下命令

openssl genrsa -out client-key.pem 1024

创建csr证书

输入以下命令创建csr证书,其中-subj参数与CA证书的csr命令含义相同。

openssl req -new -out client-req.csr -key client-key.pem -subj "/C=CN/ST=BJ/L=BJ/O=fish/OU=fish/CN=dong"

这里的CN可以是客户端的IP信息

生成crt证书

执行以下命令生成客户端证书

openssl x509 -req -in client-req.csr -out client-cert.pem -signkey client-key.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -days 3650

确认证书

openssl verify -CAfile ca-cert.pem client-cert.pem

Nginx配置

单向访问

打开nginx.conf配置文,修改你需要的地方,将配置文改为以下形式:

    server {
        listen       443 ssl;
        server_name  _;

        # 刚刚生成的服务器端公钥和私钥文件
        ssl_certificate     /etc/nginx/ssl/server-cert.pem;
        ssl_certificate_key /etc/nginx/ssl/server-key.pem;

        # 据官方文档所述,cache中的1m可以存放4000个session。
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    }

然后使用以下命令检测配置和重新加载nginx:

nginx -t
nginx -s reload

或者直接重启服务器,访问网址https://www.test.com就会发现证书认证已经起作用了,其中www.test.com就是发行证书的时候填写的域名,www.test.com也需要能够解析才可以。
此时的https并不被浏览器信任,如果需要信任证书,则只需要将公钥文件进行导入。

添加重定向

pass

双向访问

打开nginx.conf配置文,修改你需要的地方,将配置文改为以下形式:

    server {
        listen       443 ssl;
        server_name  _;

        ssl_certificate     /etc/nginx/ssl/server-cert.pem;
        ssl_certificate_key /etc/nginx/ssl/server-key.pem;

        ssl_verify_client on;
        #ssl_verify_depth 2;
        ssl_client_certificate /etc/nginx/ssl/ca-cert.pem;
     
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    }

然后重启服务器,访问网址https://www.test.com就会发现依旧没有办法访问,此时需要导入客户端的证书文件,就可以进行访问了,实现了https的双向访问。

参考文章:

上一篇 下一篇

猜你喜欢

热点阅读