首先介绍名词:
X.509 :数字证书的标准,由国际电信联盟制定。
pkcs#1-15 :The Public-Key Cryptography Standards,由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准。
pem/der :两种编码格式,pem是base64,der是二进制。
crt/cer : certificate的缩写,证书。
csr : Cerfificate Signing Request ,证书签名请求。
非对称加密:RSA、DSA、DH、椭圆曲线EC,有公钥密钥。
对称加密:AES、DES、Blowfish、CAST、IDEA、RC系列。
信息摘要算法/散列(hash)算法:MD系列、SHA系列、RIPEMD、DSS,理论上不能复原,用来签名与验证。
OPENSSL操作(以RSA为例,我们生成第一个密钥和证书作为CA,生成第二个密钥和证书请求去完成CA认证):
生成密钥:openssl genrsa -des -out caPrivate.pem 1024
-des:加密密钥,需要输入密码,可不用。
最后的数字是密钥字节数,对编解码有一定影响,推荐1024的整数倍1/2/3/4,太大则影响效率。
从密钥取公钥:openssl rsa -in caPrivate.pem -pubout -out caPublic.pem
用密钥生成证书:openssl req -new -x509 -days 365 -key caPrivate.pem -out ca.crt
会让你输入参数,其中Common Name必须填写,不然会在某些情况下发生错误。
-days:设置有效天数
用下列代码再次生成密钥:
openssl genrsa -out myPrivate.pem 1024
openssl rsa -in myPrivate.pem -pubout -out myPublic.pem
用密钥创建证书请求:openssl req -new -out my.csr -key myPrivate.pem
用CA证书给改证书请求下发证书:openssl x509 -req -days 365 -in my.csr -CA ca.crt -CAkey caPrivate.pem -set_serial 01 -out my.crt
证书验证:openssl verify -CAfile ca.crt my.crt
返回OK表示成功!
证书主要用来做站点、服务器验证,CA作第三方公正。
这里生成的RSA公钥密钥可以用来做签名(sign)与验证(verify),编码(encrypt)与解码(decrypt)。
举个PHP的例子:
$private=$this->prvkey2;//密钥
$public=$this->pubkey2;//公钥
// 签名与验证
openssl_sign('pzn',$signature,$private);
echo openssl_verify('pzn',$signature,$public);//返回1,验证成功
// 编码与解码
// 创建一个长字符串
$data='';
for ($i=0; $i < 8; $i++) {
for ($j=0; $j < 117; $j++) {
$data.=$i;
}
}
echo $data;//对比下面的$str
$encrypt='';// 一次最多加密117个字符,开始切割
foreach (str_split($data,117) as $v) {
openssl_private_encrypt($v, $crypted, $private);//第二个参数是引用传参,用来接收加密产生的二进制数据
$encrypt.=$crypted;
}
dump(base64_encode($encrypt));//看看加密的结果
$str='';// 一次最多解密128个字符,开始切割
foreach (str_split($encrypt,128) as $v) {
openssl_public_decrypt($v,$d,$public);//第二个参数是引用传参,用来接收解密产生的数据
$str.=$d;
}
echo $str;//对比上面的$data
附上可用密钥公钥:
$prvkey2='-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALPSrp01VxkQ8Fyw
AtPsvFw9SmnmjoYhroNlEUCekkp66/WcVfFX/4TWQ5z3XuWytzAoRxdgROXwB/7R
hHAu2FRNJqH5FBNKLkg6Wvh67oBGBdn4qGxN7PI/1AkFQmXGTY2KLJj/ljlUejNV
NVpARcdaiKTzjSd0nxwbzlK2DsdTAgMBAAECgYAj6U811hEu0FMwL3ZhHEYBpbvW
qlSMNO3FD8oCPai5dxLoWfBP4mMFBEU8c6pf9PDgjSqlYHRh9y2hlfX88V4CIc5a
pEY7EoWS3aH/Fw8ERI/pmScLq5Gc2OIK1+gIAQQm/vr76HMbQzhl+Ip43EZlCVD7
uHeSHDSMwRLxJhXDAQJBAOwztKm3ml1+6+l7TZceovrU+fYQvIQzCc9yLLKfFET2
MNcIXClgjlu952/p3CougBRy+A8vOEXYTdXV5+qV8AUCQQDC5Tnu8/T/cyrORmHL
IBK9VsdsDANL+FXE5xuopTKoiUdbeXZanD7gkO2tRERetjxTbJRL5Eyu9ZMDoQ7r
4nF3AkA7F8R/IVwRQAutYhfLUvLbZiUTFqTTPiGaMKpWFc5wYlddtM253FpBQYWB
TjSyqOeKNikxQ1MExlTSxq0610AxAkBDLn8k5oValRl5V3uYaGrtR3+guBde1bDD
GiNHpAJtZDzrxFfO7jMid/LmGjUzLMBoxXHtIzpnyREvXBJnr3wLAkA6v22TWJrx
KD8EnruwZ5St5xPDN3wYF0zHp2p7RwX9itAKxYQkQBpuqp4ad4nBydBJsQw73T8G
odBp8t+ZsZBR
-----END PRIVATE KEY-----';
$pubkey2='-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz0q6dNVcZEPBcsALT7LxcPUpp
5o6GIa6DZRFAnpJKeuv1nFXxV/+E1kOc917lsrcwKEcXYETl8Af+0YRwLthUTSah
+RQTSi5IOlr4eu6ARgXZ+KhsTezyP9QJBUJlxk2NiiyY/5Y5VHozVTVaQEXHWoik
840ndJ8cG85Stg7HUwIDAQAB
-----END PUBLIC KEY-----';