nodejs配置微信小程序本地服务器(一):OpenSSL生成自签名SSL证书

OpenSSL生成自签名SSL证书

科普:TLS、SSL、HTTPS以及证书

很多人可能听过其中的超过3个名词,但它们究竟有什么关联呢?html

TLS 是传输层安全协议(Transport Layer Security)的缩写,是一种对基于网络的传输的加密协议,能够在受信任的第三方公证基础上作双方的身份认证。TLS能够用在TCP上,也能够用在无链接的UDP报文上。协议规定了身份认证、算法协商、密钥交换等的实现。
SSL 是TLS的前身,如今已再也不更新。
HTTPS 是在基于TLS/SSL的安全套接字上的的应用层协议,除了传输层进行了加密外,其它与常规HTTP协议基本保持一致
证书 是TLS协议中用来对身份进行验证的机制,是一种数字签名形式的文件,包含证书拥有者的公钥及第三方的证书信息。
证书分为2类: 自签名证书和CA证书。通常自签名证书不能用来进行身份认证,若是一个server端使用自签名证书,client端要么被设置为无条件信任任何证书,要么须要将自签名证书的公钥和私钥加入受信任列表。但这样一来就增长了server的私钥泄露风险。
TLS基于CA的身份认证基本原理是:首先验证方须要信任CA提供方本身的证书(CAcert),好比证书在操做系统的受信任证书列表中,或者用户经过“安装根证书”等方式将CA的公钥和私钥加入受信任列表;而后CA对被验证方的原始证书进行签名(私钥加密),生成最终的证书;验证方获得最终的证书后,利用CAcert中包含的公钥进行解密,获得被验证方的原始证书。
根据RSA的加密原理,若是用CA的公钥解密成功,说明该证书的确是用CA的私钥加密的,能够认为被验证方是可信的。

微信小程序对第三方服务端的网络通讯方式支持https和Websocket,WebSocket是HTML5开始提供的一种在单个 TCP 链接上进行全双工通信的协议,解决了HTTP协议效率低下的问题,能更好的节省服务器资源和带宽并达到实时通信。
这里选择使用node.js配置本地服务器,它有不少websocket库,ws就是其中之一,号称最轻量级,最快。ws的用法比较简单,直接看https://github.com/websockets/ws就能够。
这里着重讲的是针对微信小程序实现的加入ssl证书的websocket实现。
生产环境建议你去买一个ssl证书,开发环境你能够给本身生成一个ssl自签名证书临时用一下。这里的开发环境为win7 X64系统node

1、安装OpenSSL

下载连接:http://slproweb.com/products/Win32OpenSSL.html
这里建议下载32位版本,由于window任何版本都能使用。git

!!!强烈建议下载v1.0.2的版本,千万不要用v1.1.0及更新的版本,由于会出现已经bug:“problem creating object tsa_policy1=1.2.3.4.1”!
若是安装过程出现这个窗口,说明你的电脑没有安装Visual C++ 2008 Redistributables, 请自行下载安装。github

这里写图片描述

剩下的安装所有默认便可。我安装在 D:OpenSSL-Win32 目录下。在这里我想将证书输出到 D盘根目录下,首先用管理员权限打开cmd(切记!!!)
而后进入D盘根目录。在建立证书以前,你须要设置2个环境变量:web

  • set RANDFILE=D:\.rnd
  • set OPENSSL_CONF=D:OpenSSL-Win32binopenssl.cfg

第二句告诉系统去哪找openssl.cfg文件。
如今能够运行OpenSSL了,cmd中输入 D:OpenSSL-Win32binopenssl.exe运行。以上过程如图:
这里写图片描述算法

2、生成服务器证书

第一步:对于一个网站,首先必须有本身的私钥。为服务器建立一个1024位的RSA密钥,并保存到ca.key文件中:

openssl genrsa -out ssl.key 1024

若是想要添加密码保护,则改为如下命令:小程序

openssl genrsa -des3 -out ssl.key 1024
利用私钥就能够生成证书了。OpenSSL使用 x509命令生成证书。这里须要区分两个概念: 证书(certificate)证书请求(certificate sign request)
证书是自签名或CA签名过的凭据,用来进行身份认证。
证书请求是对签名的请求,须要使用私钥进行签名
x509命令能够将证书和证书请求相互转换,不过咱们这里只用到从证书请求到证书的过程。

第二步:从私钥或已加密的私钥都可以生成"证书请求":

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

若是私钥已加密,须要输入密码。req命令会经过命令行要求用户输入国家、地区、组织等信息,这些信息会附加在证书中展现给链接方。微信小程序

第三步:用私钥对“证书请求”进行签名生成证书crt。根据不一样的场景,签名的方式也略有不一样:

(一)自签名,生成私有证书

自签名的原理是用私钥对该私钥生成的“证书请求”进行签名,生成证书文件。该证书的签发者就是本身,因此验证方必须有该证书的私钥才能对签发信息进行验证,因此要么验证方信任一切证书,面临冒名顶替的风险,要么被验证方的私钥(或加密过的私钥)须要发送到验证方手中,面临私钥泄露的风险。
固然自签名也不是一无用处,好比须要内部通信的两台电脑须要使用加密又不想用第三方证书,能够在两端使用相同的私钥和证书进行验证(固然这样就跟对称加密没有区别了)。自签名的方法为:安全

openssl x509 -req -in ssl.csr -signkey ssl.key -out ssl.crt
(二)自签名,生成CA证书

CA证书是一种特殊的自签名证书,能够用来对其它证书进行签名。这样当验证方选择信任了CA证书,被签名的其它证书就被信任了。在验证方进行验证时,CA证书来自操做系统的信任证书库,或者指定的证书列表。服务器

openssl x509 -req -in sign.csr -extensions v3_ca -signkey sign.key -out sign.crt
(三)利用CA证书对其它证书进行签名
openssl x509 -req -in ssl.csr -extensions v3_usr -CA sign.crt -CAkey sign.key -CAcreateserial -out ssl.crt

3、拓展知识

若是想将下属CA密钥用于受权码签名(经过Microsoft’s signtool工具),你必须把密钥和证书打包进一个PKCS12文件。

pkcs12 -export -out ia.p12 -inkey ia.key -in ia.crt -chain -CAfile ca.crt

这里写图片描述

若是在上一节中,你将根CA和下属CA的Common Name设置成同样了,那么这一步你会获得这样的报错:

Error self signed certificate getting chain.
error in pkcs12

在Window上用signtool给可执行文件签名的方法:
“受信仰的根证书颁发机构”存储区中安装 ia.p12 文件(如:双击它),而后用signtool /wizard为它签名。

在上面你建立的证书(.crt文件)也能够双击来查看和安装它:
这里写图片描述


欢迎加QQ群交流:146202960
或点击连接加入QQ群聊:https://jq.qq.com/?_wv=1027&k...

相关文章
相关标签/搜索