文章目录
一、术语
-
SSL,安全套接字层(Secure Socket Layer)的缩写。
-
TLS,传输层安全协议(Transport Layer Security)的缩写,建立在
SSL 3.0
协议规范之上,是SSL 3.0
的后续版本。 -
KEY,通常指私钥。
-
CSR,证书签名请求(Certificate Signing Request)的缩写,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
-
CRT,certificate的缩写,即证书。
-
X.509,是一种证书格式,对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。X.509的证书文件,该文件的内容编码格式,可以分为以下二种格式:
(1)PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN...
"开头, "-----END...
"结尾,内容是BASE64编码。Apache和*NIX服务器偏向于使用这种编码格式,一般以.crt
结尾,例如:server.crt。
(2)DER - Distinguished Encoding Rules,打开看是二进制格式,不可读。Java和Windows服务器偏向于使用这种编码格式,一般以.cer
结尾,例如:server.cer。
密钥的两种格式转换方式:openssl rsa -inform DER -in server.key -outform PEM -out server.key
openssl rsa -inform PEM -in server.key -outform DER -out server.key
证书的两种格式转换方式:
openssl x509 -inform DER -in server.cer -outform PEM -out server.crt
openssl x509 -inform PEM -in server.crt -outform DER -out server.cer
二、创建证书
openssl相当于ssl的一个实现,如果把ssl规范看成面向对象中的接口,那么openssl则认为是接口的实现。
1、说明
(1)SSL单向认证
- 服务器需要:server证书、server私钥。
- 客户端需要:不需要证书。
(2)SSL双向认证
- 服务器需要:server证书、server私钥。
- 客户端需要:client证书、client私钥。
2、创建CA根证书
- 创建CA证书私钥文件(PEM)
openssl genrsa -aes256 -out ca.key 2048
-aes256
用于指定私钥将使用aes256算法进行加密。
- 创建证书签名请求文件
信息参数含义如下:
C — 国家(Country Name),2个字母
ST — 省份(State or Province Name)
L — 城市(Locality Name)
O — 组织或企业(Organization Name)
OU — 部门(Organizational Unit Name)
CN — 域名或IP(Common Name)
emailAddress — 邮箱(Email Address)
openssl req -new -sha256 -key ca.key -out ca.csr -subj "/C=CN/ST=FJ/L=XM/O=JH/OU=dev/CN=www.demo.com/emailAddress=admin@jh.com"
- 自签名证书
openssl x509 -req -days 36500 -sha256 -signkey ca.key -in ca.csr -out ca.crt
3、生成服务器证书
- 创建服务器私钥
openssl genrsa -aes256 -out server.key 2048
- 生成服务器公钥
openssl rsa -in server.key -pubout -out server.pub
- 创建证书签名请求文件
openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CN/ST=FJ/L=XM/O=JH/OU=dev/CN=www.demo.com/emailAddress=admin@jh.com"
- 使用CA根证书签名服务器证书
openssl x509 -req -days 36500 -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
4、生成客户端证书
- 生成客户端私钥
openssl genrsa -aes256 -out client.key 2048
- 创建证书签名请求文件
openssl req -new -sha256 -key client.key -out client.csr -subj "/C=CN/ST=FJ/L=XM/O=JH/OU=dev/CN=www.demo.com/emailAddress=admin@jh.com"
- 使用CA根证书签名客户端证书
openssl x509 -req -days 36500 -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
5、说明
如果要在google等浏览器显示出安全的绿锁标志,自己颁发的证书肯定不好使,得花钱向第三方权威证书颁发机构申请(即:第2步中的创建CA根证书变为购买,然后第3步中的签发工作是交给权威机构来做,我们只需要提交server.csr
,然后权威机构会返回给我们server.crt
)。
三、keytool工具
1、创建证书和密钥
keytool
是Java原生自带的密钥和证书管理工具,方便用户能够管理自己的公钥/私钥及证书,用于认证服务。它将密钥(key)和证书(certificates)存储在keystore文件中。例如:
keytool -genkey -keyalg RSA -keysize 2048 -validity 3650 -alias server -keystore "/home/server.keystore"
-genkey
:表示生成密钥对(公钥和私钥)。-keyalg
:指定密钥的算法,如:RSA、DSA(如果不指定默认采用DSA)。-keysize
:密钥长度,默认2048。-validity
:指定创建的证书有效期多少天,默认90天。-alias
:指定密钥条目的别名,该别名是公开的。-keystore
:用于指定密钥仓库文件名称及其位置。
例如:
2、导出证书
DER
格式:keytool -export -alias server -keystore "/home/server.keystore" -file server.cer
,例如:
PEM
格式:keytool -export -alias server -keystore "/home/server.keystore" -rfc -file server.crt
,例如:
3、将客户端证书导入到服务器端信任的keystore里
keytool -import -alias client -keystore servertrust.keystore -file 客户端证书文件(如:DER格式client.cer或PEM格式client.crt)
。
4、导出私钥
(1)得到pkcs12格式的证书
keytool -importkeystore -srckeystore "/home/server.keystore" -destkeystore server.p12 -deststoretype pkcs12
(2)转化成PEM格式的文件
openssl pkcs12 -in server.p12 -out server.pem
(3)提取私钥
使用记事本打开server.pem
文件,找到私钥对应的内容块,拷贝到独立文件,例如:server.key
。例如:
四、经验总结
1、在浏览器上无法和WSS服务建立连接
问题: 在本地搭建了一个websocket的wss服务,访问地址为:wss://127.0.0.1:4444
,本地实现简单的websocket客户端连接,如:
var ws = new WebSocket("wss://127.0.0.1:4444"); // 创建WebSocket连接
无法和wss服务建立连接。不同浏览器现象不一致。
(1)Firefox
浏览器报错
wss服务报错
解决方案
-
打开浏览器“设置”->“隐私与安全”->“查看证书”。
-
选择“服务器”标签页,点击“添加例外”按钮,输入wss服务地址和端口,点击“获取证书”。需要保证
127.0.0.1:4444
当下是可访问的。
-
选中“永久保存此例外”,点击“确认安全例外”。
结果如:
此时再刷新下页面,结果如: