证书相关

密码学相关的标准、协议很多,想要程序马上work容易,想要搞清楚原理,需要花些时间才行

SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等

SSL

Scure Sockets Layer,现在应该叫 TLS,但习惯问题,还是叫"SSL"比较多

https加密基于SSL,加密对用户和开发者都是透明的

OpenSSL

SSL规范的一个实现

还提供了一大堆强大的工具软件,强大到90%我们都用不到

证书标准

X.509 ,证书标准,定义证书中应包含哪些内容

SSL就用这种证书标准

编码格式

同样的X.509证书,可能有不同编码格式

  • PEM 文本格式

-----BEGIN 开头, -----END 结尾,内容BASE64编码

openssl x509 -in certificate.pem -text -noout

*NIX 偏向于用这种

  • DER 二进制格式
1
openssl x509 -in certificate.der -inform der -text -noout

Java和Windows偏向于用这种

文件扩展名

比较误导人的地方,PEM和DER两种编码格式,文件扩展名不一定就叫这

CRT - 常见于*NIX,大多PEM编码

CER - 常见于Windows系统,大多DER编码

KEY - 通常用存私钥,并非X.509证书

1
openssl rsa -in mykey.key -text -noout

如果是DER格式

1
openssl rsa -in mykey.key -text -noout -inform der

CSR - 核心内容是一个公钥(还附带一些别的信息),生成申请时,同时也生成私钥

1
openssl req -noout -text -in my.csr 

DER 照旧加上-inform der

PFX/P12

*nix 一般CRT和KEY分开存放在不同文件中

Windows的IIS存在一个PFX文件,(包含证书及私钥)

会不会不安全?PFX通常会有一个"提取密码"

PFX用DER编码

PFX转PEM

1
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

生成pfx

1
openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx -certfile CACert.crt

CACert.crt 是CA根证书,有通过-certfile一起带进去

JKS - Java Key Storage

Java专利,跟OpenSSL关系不大

keytool,可以将PFX转为JKS,也能直接生成JKS

证书编码的转换

PEM转DER

1
openssl x509 -in cert.crt -outform der -out cert.der

DER转为PEM

1
 openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

(转KEY也类似,x509换成rsa,转CSR的话,x509换成req)

向证书颁发机构申请证书

生成csr

1
openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out my.csr

csr交给证书颁发机构,机构对此进行签名,保留好csr,当证书过期时,还可以用同样的csr来申请新的证书,key保持不变

或者生成自签名的证书

1
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

其实真正要填的只有Common Name,写服务器的域名,“yourcompany.com”,或者服务器IP,其它都可以留空的