【精华版!】OPENSSL操作与各名词概念,一篇通!

首先介绍名词:

    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-----';

猜你喜欢

转载自blog.csdn.net/qq_40670457/article/details/80002665