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

实验环境

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

名词解析

  • SSL:Secure Socket Layer,安全套接字层,它位于TCP层与Application层之间。提供对Application数据的加密保护(密文),完整性保护(不被篡改)等安全服务。

  • TLS:Transport Layer Secure,提供安全的传输服务,十分灵活,可以使用在TCP上,也可以使用在UDP上,也可以使用在数据链路层上。

  • 公钥:大家公用的,可以被其他人下载,用来加密和验章。

  • 私钥:自己私有,须小心保存,用来解密和签章。

  • 数字签名:将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而产生的报文即称数字签名。

  • 数字证书:数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。

  • CA:Certificate Authority,证书授权中心。是一个单位,来管理发放数字证书的。由它发放的证书就叫 CA 证书,以区别于个人使用工具随意生成的数字证书,查看 CA 证书,里面有两项重要内容,一个是颂发给谁,另一个是由谁颂发的。

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的双向访问。

参考文章:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容