使用linux自建证书(ios强制https 微信小程序强制https 本地开发环境)

现在都要https了,很多童鞋也痛苦本地该如何搭建https环境,网上一搜 一搜一大把,但是使用就。。。。。。

今天在这里笔者就教大家一步一步使用linux搭建本地的https环境。。。因我司使用的nginx 所以接口相关的服务端配置 也只列出nginx 的配置接下来看笔者如何一步一步弄好https。(可以调用openssl命令雷同!)

假设我司有alp环境,bet环境 我司线上域名为test.com 对应的则为 test.alp test.bet相关域名 则我本地应该生成通配型的*.test.alp *.test.bet (ps:注意一点很重要三级域名需要单独配置 如:m.a.test.alp 需要单独生成 *.a.test.alp 的通配型 或者 m.a.test.alp 购买证书的时候也是如此! 一个点多1W多块钱!! 很重要!!!本篇文章不涉及三级域名只争对二级的本地配置)

生成根CA的key

linux下使用如下命令:

openssl genrsa -des3 -out RootCA.key 2048

过程中会出现如下提示则为需要给根证书的key设置一个密码(我直接输入了123456):

Enter pass phrase for RootCA.key:

接下来如下提示为确认输入根证书的key密码(依然123456):

Verifying - Enter pass phrase for RootCA.key:

则生成了根证书的key:

[root@localhost key]# ll
total 4
-rw-r--r-- 1 root root 1751 Jan  5 10:27 RootCA.key
[root@localhost key]#

生成CA的证书crt(Common Name填RootCA 其他的都不填写 这个证书是需要安卓手机 浏览器 苹果手机 mac 都需要去安装的ps:苹果手机需要使用url的形式或者邮件的形式才能安装 很重要!!电脑版安装的时候需要将证书添加到受信任的根证书中 手机 ios 不需要 注意!!)

linux下使用如下命令:

openssl req -new -x509 -sha256 -days 3650 -key RootCA.key -out RootCA.crt

然后提示输入密码(刚刚设置的123456):

Enter pass phrase for RootCA.key:

如下提示直接回车:

Country Name (2 letter code) [XX]:

如下提示直接回车:

State or Province Name (full name) []:

如下提示直接回车:

Locality Name (eg, city) [Default City]:

如下提示直接回车:

Organization Name (eg, company) [Default Company Ltd]:

如下提示直接回车:

Organizational Unit Name (eg, section) []:

如下提示填RootCA即可:

Common Name (eg, your name or your server's hostname) []:RootCA

如下提示直接回车:

Email Address []:

将生成RootCA.key 现在可以将这个key发给测试的同事 开发的同事 安装此证书(ps:苹果手机需要使用url的形式或者邮件的形式才能安装 很重要!!)

[root@localhost key]# ll
total 8
-rw-r--r-- 1 root root 1265 Jan  5 10:42 RootCA.crt
-rw-r--r-- 1 root root 1751 Jan  5 10:33 RootCA.key
[root@localhost key]#

生成*.test.alp的证书(包含key 和 crt)

生成*.test.alp证书的key

openssl genrsa -des3 -out testalp.key 2048

如下提示输入key的密码(我输入的依然为123456):

Enter pass phrase for testalp.key:

如下提示再次确认密码(输入123456):

Verifying - Enter pass phrase for testalp.key:

即生产一个含有密码的*.test.alp证书的key

[root@localhost key]# ll
total 12
-rw-r--r-- 1 root root 1265 Jan  5 10:42 RootCA.crt
-rw-r--r-- 1 root root 1751 Jan  5 10:33 RootCA.key
-rw-r--r-- 1 root root 1743 Jan  5 10:48 testalp.key
[root@localhost key]#

刚刚生成的是带密码的 现在导出一个无密码的*.test.alp证书的key(nginx使用的就是现在生产的这个无密码的*.test.alp证书的key)

如下命令通过key生成一个无密码的key:

openssl rsa -in testalp.key -out testalp_nopass.key

如下提示输入密码(输入123456):

Enter pass phrase for testalp.key:

即生产了testalp_nopass.key:

[root@localhost key]# ll
total 16
-rw-r--r-- 1 root root 1265 Jan  5 10:42 RootCA.crt
-rw-r--r-- 1 root root 1751 Jan  5 10:33 RootCA.key
-rw-r--r-- 1 root root 1743 Jan  5 10:48 testalp.key
-rw-r--r-- 1 root root 1675 Jan  5 11:00 testalp_nopass.key
[root@localhost key]#

根据*.test.alp的key生产证书签名的请求文件(这个请求文件等会需要 使用RootCA.key签名 这里使用 testalp_nopass.key去生成 ps:这里一定要注意一个问题 Common Name 一定要写:*.test.alp)

如下命令生产请求文件testalp_nopass.csr:

openssl req -new -sha256 -days 3650 -key testalp_nopass.key -out testalp_nopass.csr

如下提示直接回车:

Country Name (2 letter code) [XX]:

如下提示直接回车:

State or Province Name (full name) []:

如下提示直接回车:

Locality Name (eg, city) [Default City]:

如下提示直接回车:

Organization Name (eg, company) [Default Company Ltd]:

如下提示直接回车:

Organizational Unit Name (eg, section) []:

如下输入*.test.alp 很重要!!:

Common Name (eg, your name or your server's hostname) []:\*.test.alp

如下提示直接回车:

Email Address []:

如下提示直接回车:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:

如下提示直接回车:

An optional company name []:

则生成了名字为*.test.alp的请求文件testalp_nopass.csr:

[root@localhost key]# ll
total 20
-rw-r--r-- 1 root root 1265 Jan  5 10:42 RootCA.crt
-rw-r--r-- 1 root root 1751 Jan  5 10:33 RootCA.key
-rw-r--r-- 1 root root 1743 Jan  5 10:48 testalp.key
-rw-r--r-- 1 root root  980 Jan  5 11:06 testalp_nopass.csr
-rw-r--r-- 1 root root 1675 Jan  5 11:00 testalp_nopass.key
[root@localhost key]#

最后一步通过之前生成的RootCA.key 和RootCA.crt签名testalp_nopass.csr并生成testalp_nopass.crt

如下命令:

openssl ca -md sha256 -in testalp_nopass.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out testalp_nopass.crt -cert RootCA.crt -keyfile RootCA.key

如下提示需要输入RootCa.key的密码(我的为之前配置的123456):

Enter pass phrase for RootCA.key:

很高兴的报错了:

/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
139938927691592:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r')
139938927691592:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
[root@localhost key]#

这也是我刻意用新机器发生的错误 该错误的解决办法: 如下命令:

touch /etc/pki/CA/index.txt

然后继续执行:

openssl ca -in testalp_nopass.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out testalp_nopass.crt -cert RootCA.crt -keyfile RootCA.key

如下提示需要输入RootCa.key的密码(我的为之前配置的123456):

Enter pass phrase for RootCA.key:

很高兴又报错了:

Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for RootCA.key:
/etc/pki/CA/serial: No such file or directory
error while loading serial number
139989781997384:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/serial','r')
139989781997384:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
[root@localhost key]#

该错误的解决办法: 如下命令:

touch /etc/pki/CA/serial
echo "00" > /etc/pki/CA/serial

然后继续执行:

openssl ca -in testalp_nopass.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out testalp_nopass.crt -cert RootCA.crt -keyfile RootCA.key

如下提示需要输入RootCa.key的密码(我的为之前配置的123456):

Enter pass phrase for RootCA.key:

恭喜恭喜三连错:

Check that the request matches the signature
Signature ok
The mandatory stateOrProvinceName field was missing
[root@localhost key]#

该错误的解决办法:

把/etc/pki/tls/openssl.cnf中大约86 87的行

请使用vi把如下内容

stateOrProvinceName= match
organizationName= match
修改成 
stateOrProvinceName= optional 
organizationName= optional 
在保存就可以了。

然后继续执行:

openssl ca -in testalp_nopass.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out testalp_nopass.crt -cert RootCA.crt -keyfile RootCA.key

如下提示需要输入RootCa.key的密码(我的为之前配置的123456):

Enter pass phrase for RootCA.key:

如下提示输入y:

Sign the certificate? [y/n]:y

如下提示输入y:

1 out of 1 certificate requests certified, commit? [y/n]y

则签名成功:

[root@localhost key]# ll
total 28
-rw-r--r-- 1 root root 1265 Jan  5 10:42 RootCA.crt
-rw-r--r-- 1 root root 1751 Jan  5 10:33 RootCA.key
-rw-r--r-- 1 root root 1743 Jan  5 10:48 testalp.key
-rw-r--r-- 1 root root 4373 Jan  5 11:26 testalp_nopass.crt
-rw-r--r-- 1 root root  980 Jan  5 11:06 testalp_nopass.csr
-rw-r--r-- 1 root root 1675 Jan  5 11:00 testalp_nopass.key
[root@localhost key]#

到这里对如下文件进行说明:

  • nginx只需要testalp_nopass.crt 以及testalp_nopass.key即可

  • 浏览器 手机端只需要安装 RootCA.crt 即可 且这个RootCA.crt是不需要到最后弄完了才可以使用,这个crt安装了之后后续该电脑 该手机设备 不需要再次更新安装!!一次安装永久有效 也不会影响后续对*.test.bet的签发(ps:苹果手机需要使用url的形式或者邮件的形式才能安装 很重要!! 电脑版安装的时候需要将证书添加到受信任的根证书中 手机 ios 不需要 注意!!)

  • *.test.bet的签发和生产也如上*.test.alp一样即可

示例

nginx下的配置:

我在nginx 的conf目录下创建了一个key的文件夹存放 testalp_nopass.crt 和testalp_nopass.key:

[root@localhost key]# ll
total 12
-rw-r--r-- 1 root root 4373 Jan  5 11:26 testalp_nopass.crt
-rw-r--r-- 1 root root 1675 Jan  5 11:00 testalp_nopass.key
[root@localhost key]# pwd
/usr/local/etc/nginx/conf/key
[root@localhost key]#

配置nginx.conf增加如下配置(因只做测试 直接在nginx.conf直接配置 且项目为写的html的测试页):

server
    {
       listen 443;
       #很重要的配置 必须server_name需要对应
       server_name test.test.alp;
       ssl on;
       ssl_certificate key/testalp_nopass.crt;
       ssl_certificate_key key/testalp_nopass.key;
       index index.html;
       root  /data/test/;
    }

主要配置为:

   listen 443;
   server_name test.test.alp;
   ssl on;
   ssl_certificate key/testalp_nopass.crt;
   ssl_certificate_key key/testalp_nopass.key;

浏览器上若说找不到颁发者需要安装证书Root.crt(电脑版安装的时候需要将证书添加到受信任的根证书中 手机 ios 不需要 注意!!)

切记电脑端需要添加到受信任的根证书颁发机构!

到最后说一点就是如果你需要重新配置需要清空/etc/pki/CA/index.txt这个文件

如下命令:

echo > /etc/pki/CA/index.txt

即可