openssl为IP签发证书(支持多IP/内外网)

参考文档
1. OpenSSL自签发配置有多域名或ip地址的证书
2. 如何创建一个自签名的SSL证书(X509)
3. 如何创建自签名证书?

背景

  • 开启https必须要有ssl证书,而安全的证书来源于受信任的CA机构签发,通常需要付费,并且他们只能为域名和外网IP签发证书。
  • 证书有两个基本目的:分发公有密钥和验证服务器的身份。只有当证书是由受信任的第三方所签署的情形下,服务器的身份才能得到恰当验证,因为任何攻击者都可以创建自签名证书并发起中间人攻击。
  • 但自签名证书可应用于以下背景:
    • 企业内部网。当客户只需要通过本地企业内部网络时,中间人攻击几乎是完全没有机会的。
    • 开发服务器。当你只是在开发或测试应用程序时,花费额外的金钱去购买受信任的证书是完全没有必要的。
    • 访问量很小的个人站点。如果你有一个小型个人站点,而该站点传输的是不重要的信息,那么攻击者很少会有动机去攻击这些连接。

依赖

利用 OpenSSL 签发证书需要 OpenSSL 软件及库,一般情况下 CentOS、Ubuntu 等系统均已内置, 可执行 openssl 确认,如果提示 oepnssl: command not found,则需手动安装,以Centos为例:

yum install openssl openssl-devel -y

签发证书

step1: 生成证书请求文件

新建openssl.cnf,内容如下:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = CH
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = GD
localityName = Locality Name (eg, city)
localityName_default = ShenZhen
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName_default  = organizationalUnitName
commonName = Internet Widgits Ltd
commonName_max  = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]

# 改成自己的域名
#DNS.1 = kb.example.com
#DNS.2 = helpdesk.example.org
#DNS.3 = systems.example.net

# 改成自己的ip
IP.1 = 172.16.24.143
IP.2 = 172.16.24.85


step2: 生成私钥

san_domain_com 为最终生成的文件名,一般以服务器命名,可改。

openssl genrsa -out san_domain_com.key 2048

step3: 创建CSR文件

创建CSR文件命令:

openssl req -new -out san_domain_com.csr -key san_domain_com.key -config openssl.cnf

执行后,系统会提示输入组织等信息,按提示输入如即可。

测试CSR文件是否生成成功,可以使用下面的命令:

openssl req -text -noout -in san_domain_com.csr

//执行后,会看到类似如下的信息:
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=US, ST=MN, L=Minneapolis, OU=Domain Control Validated, CN=zz
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                //...

step4: 自签名并创建证书

openssl x509 -req -days 3650 -in san_domain_com.csr -signkey san_domain_com.key -out san_domain_com.crt -extensions v3_req -extfile openssl.cnf

执行后,可看到本目录下多了以下三个文件

san_domain_com.crt

san_domain_com.csr

san_domain_com.key

至此,使用openssl生成证书已完成,以下 nodejs项目验证将证书导入本地 仅是验证证书是否正常可用。

利用nodejs项目验证证书是否可行

step1. 环境

安装node和npm.

step2. 项目结构

ssl-test
├─ cert   //打包所需静态资源
│  ├─ san_domain_com.crt
│  └─ san_domain_com.key
├─ package.json
└─ https.js

step3. https.js

文件内容如下:

'use strict'
var https = require("https");
var fs = require('fs');
var options = {
    key: fs.readFileSync("./cert/san_domain_com.key", 'utf8'),
    cert: fs.readFileSync("./cert/san_domain_com.crt", 'utf8')
};

var app = https.createServer(options, function (req, res) {
    res.writeHead(200, {'Cntent-Type': 'text/plain'});

    res.end('Https !')
}).listen(443, '0.0.0.0');

step4. 启动项目

执行以下命令:

node https.js

执行后,即可访问 https://127.0.0.1,chrome浏览器上点击“不安全”->"证书",即可查看证书详细。

1.png

将证书导入本地(windows)

上一步中,使用chrome访问 https://127.0.0.1 提示了“不安全”。

  • 对于web端用户,可以“手动点击信任”来绕过此提示。
  • 但安卓端、C++等终端需要调用https站点的API时,他们应该如何解决?有以下两种方式:
    • 客户端在代码层面直接忽略掉不安全的提示。(不提倡,某些恶意网站可能也会被忽略)
    • san_domain_com.crt证书导入到客户端中。

此处,以浏览器作为客户端演示如何将证书设置为受信任的证书。

step1. 环境

windows 7系统、chrome浏览器

step2. 背景

  • 为什么使用自签发的证书时会提示不安全?

因为操作系统上会默认存有受信任机构CA的证书。—— 电脑的“运行”工具弹窗->输入"certmgr.msc"
而我们自签发的证书不在这个信任列表中,需要手动导入到这个“白名单”中。

2.png
  • https的认证流程是什么样子的?
image.png

你可能会问,为什么是这样的流程?详见下一篇文章
https诞生背景及原理解析

step3. 导入证书

右键"受信任的证书颁发机构"->"所有任务"->"导入",按照提示选择san_domain_com.crt文件即可。

1.png

清除缓存,重启浏览器,浏览https://127.0.0.1,不再提示不安全了。


image.png

至此,完成了证书的生成和客户端的导入验证。

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

推荐阅读更多精彩内容