首先介绍名词:
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-----';