openssl实现https化的自签证书生成(windows环境和linux环境两种生成方式)

背景是最近公司做了个视频会议的项目,由于视频会议技术要调用摄像头,用到webrtc的协议,所以网站是必须https化的,但是因用户处于项目试用状态,不提供CA认证的证书,只能搞个自签的证书来提供功能的使用。

这里我总结了自签证书在windows环境和linux环境下的生成方式,两则也没有任何差别,均可使用,看个人喜好,在这之前首先要知道为什么https请求需要有证书呢,为什么https会更安全呢,这里需要知道他的通信机制才能更好的理解做这个事情的目的。https请求其实包含有非对称加密和对称加密的两个加解密过程;我们生成自签证书的目的是在https请求过程中的非对称加解密部分中使用,生成了两个文件,一个是公钥证书,一个是私钥文件,我们知道非对称加密的特点是用公钥加密然后私钥解密,或者用私钥加密用公钥解密,也就是说成对的公钥和私钥可以互相解密对方的加密信息。https的通信过程大致流程是浏览器client发起一个服务请求,服务器收到请求后明文返回数字证书里的公钥,浏览器收到公钥信息后对即将要发送给服务器的随机对称秘钥用公钥进行加密,然后再发送给服务器,服务器通过私钥文件进行解密获取到浏览器的对称秘钥,这个时候握手结束并通知浏览器,浏览器接下来就用对称秘钥对需要传送的数据进行加密后再发送给服务器,服务器也用对称秘钥加密信息和浏览器进行交互,只要session key还在,就一直如此交互。大致的握手过程和交互过程如下图:

 

接下来我们就直接进入正题,给出证书的生成步骤,可以看到下面的操作步骤做完之后,我们会生成出来一个是.key的文件,一个可能是.pem的文件,其中.key文件是私钥文件,.pem文件是证书文件。有windows和linux两个环境的生成方式,这里都进行了步骤说明。其中windows环境需要先安装chocolatey,这是windows环境下的包管理工具,然后不论是windows还是linux都要安装一个openssl工具,用来生成证书文件。大致步骤如下:

 

 

Windows环境下:

安装chocolatey

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

 

安装 mkcert

 

choco install mkcert

 

CA 证书加入本地可信 CA

 

$ mkcert -install

 

默认生成路径 c:\Users\xxx\AppData\Local\mkcert

 

 

生成自签证书

mkcert domain1 [domain2 [...]]

mkcert localhost 127.0.0.1 ::1

 

windows 安装openssl

choco install openssl

 

openssl pem转p12

 

cd C:\Program Files\OpenSSL-Win64

点击start.bat 敲如下命令:

openssl pkcs12 -export -in apiclient_cert.pem -inkey apiclient_key.pem -out apiclient_cert.p12

 

我本地的是敲这个,自己根据自己的pem路径安装:openssl pkcs12 -export -in C:\Users\xuefei.lin\AppData\Local\mkcert\rootCA.pem -inkey C:\Users\xuefei.lin\AppData\Local\mkcert\rootCA-key.pem -out apiclient_cert.p12

如果需要p12转jks(前提是有安装了jdk,jdk里有keytool工具,如果没有全局设置,可以到安装jdk的bin目录下找到keytool,然后在该目录下执行以下命令):

keytool -importkeystore -srckeystore apiclient_cert.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore apiclient_cert.jks

 

Linux环境下生成证书:

 

首先,无论是在Linux下还是在Windows下的命令行模式中,进行下面的操作前都须确认已安装OpenSSL软件包。

 

1.创建根证书密钥文件(自己做CA)root.key:

  openssl genrsa -des3 -out root.key

输出:Generating RSA private key, 512 bit long modulus
……………..++++++++++++
..++++++++++++
e is 65537 (0×10001)
Enter pass phrase for root.key: ← 输入一个新密码
Verifying – Enter pass phrase for root.key: ← 重新输入一遍密码

 

2. 创建根证书的申请文件root.csr:

openssl req -new -key root.key -out root.csr

输出:Enter pass phrase for root.key: ← 输入前面创建的密码
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN
State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音
Locality Name (eg, city) []:BeiJing ← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名
Organizational Unit Name (eg, section) []: ← 可以不输入
Common Name (eg, YOUR name) []: ← 此时不输入
Email Address []:admin@mycompany.com ← 电子邮箱,可随意填

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ← 可以不输入
An optional company name []: ← 可以不输入

 

3. 创建一个自当前日期起为期十年的根证书root.crt:

openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.crt

输出内容为:
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJing/O=MyCompany Corp./emailAddress=admin@mycompany.com
Getting Private key
Enter pass phrase for root.key: ← 输入前面创建的密码

 

4. 创建服务器证书密钥server.key:

openssl genrsa -des3 -out server.key 2048

输出内容为:
Generating RSA private key, 2048 bit long modulus
….+++
…………………………………………..+++
e is 65537 (0×10001)

运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key

 

5.创建服务器证书的申请文件server.csr:

openssl req -new -key server.key -out server.csr

输出内容为:

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CN ← 国家名称,中国输入CN
State or Province Name (full name) [Some-State]:BeiJing ← 省名,拼音
Locality Name (eg, city) []:BeiJing ← 市名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名
Organizational Unit Name (eg, section) []: ← 可以不输入
Common Name (eg, YOUR name) []:www.mycompany.com ← 服务器主机名,若填写不正确,浏览器会报告证书无效,但并不影响使用
Email Address []:admin@mycompany.com ← 电子邮箱,可随便填

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ← 可以不输入
An optional company name []: ← 可以不输入

 

6.创建自当前日期起有效期为期两年的服务器证书server.crt:

openssl x509 -req -days 730 -sha1 -extensions v3_req -CA root.crt -CAkey root.key -CAserial root.srl -CAcreateserial -in server.csr -out server.crt

输出内容为:
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJing/O=MyCompany Corp./CN=www.mycompany.com/emailAddress=admin@mycompany.com
Getting CA Private Key
Enter pass phrase for root.key: ← 输入前面创建的密码

 

7 生成pem文件

  cat server.crt server.key |tee server.pem

 

8 转pem文件成p12文件(前提是安装了jdk)

openssl pkcs12 -export -in server.pem -out server.p12

虽然https的认证可以用自签证书,但是自签证书是存在安全隐患的,由上图的交互我们可以看出,似乎先进行非对称加解密达到传递对称秘钥的目的,再对称加密达到传输交互数据的目的,就能安全无忧,但并非无懈可击,如果我们在第一步浏览器向服务器请求获取公钥的时候,服务器返回的公钥被截获并篡改,再返回给浏览器,这时候浏览器是并无感知的,而浏览器在拿到错误的公钥信息后,用错误的公钥进行对对称秘钥进行加密再返回回去,这个时候截获抓取包的中间人就可以通过他自己的私钥解密获取到对称秘钥,并还可以篡改后再用目标服务器的公钥加密后发送给目标服务器;

所以如何才能保证安全呢,这个时候我们引进了第三方公证人,即CA认证服务器,CA认证服务器会告诉你他的这个公钥是否是合法的,被中间人篡改过的公钥自然就没法继续伪装,所以我们买到的域名,其实都是可以通过CA认证的公钥的,而自签的则是没有通过权威CA认证中心认证的。存在着安全隐患,但是另外一方面,用CA认证中心认证过的域名就一定能保证安全吗?其实也不尽然,因为假设CA认证中心被攻击了呢???

 

posted @ 2021-06-11 09:32  我只是个扫地的  阅读(1640)  评论(1)    收藏  举报