• php openssl 加密解密


    $config = array(
        "digest_alg" => "sha512",
        "private_key_bits" => 4096,
        "private_key_type" => OPENSSL_KEYTYPE_RSA,
    );
    
    $private_key_passwd = '123456'; //私钥密码
    $expire = 365;     //有效时长
    $cer_path = "./test.cer"; //生成证书路径
    $pfx_path = "./test.pfx"; //密钥文件路径
    
    $dn = array(
        "countryName" => "CN",                                  //所在国家
        "stateOrProvinceName" => "ANHUI",                    //所在省份
        "localityName" => "HEFEI",                        //所在城市
        "organizationName" => "Mr.sui",         //注册人姓名
        "organizationalUnitName" => "sui Team",   //组织名称
        "commonName" => "lucky",                          //公共名称
        "emailAddress" => "sui@qq.com"                     //邮箱
    );
    
    // 生成公钥私钥资源
    $res = openssl_pkey_new($config);
    
    // 导出私钥 $private_key
    openssl_pkey_export($res, $private_key,null,$config);
    
    //  导出公钥 $pubKey
    $public_key = openssl_pkey_get_details($res);
    $public_key = $public_key["key"];
    //print_r($private_key); 私钥
    //print_r($public_key); 公钥
    
    //直接测试私钥 公钥
    echo '-------------------公私钥加解密T---------------------'.PHP_EOL;
    $data = '我是 data,哈哈哈';
    // 公钥加密
    openssl_public_encrypt($data, $encrypted, $public_key);
    // 私钥解密
    openssl_private_decrypt($encrypted, $decrypted, $private_key);
    
    echo '公钥加密:',base64_encode($encrypted).PHP_EOL;
    echo '私钥解密后的数据:'. $decrypted.PHP_EOL;
    echo '-------------------公私钥加解密-END---------------------'.PHP_EOL;
    
    echo '-------------------生产证书---------------------'.PHP_EOL;
    //生成文件
    $csr = openssl_csr_new($dn, $private_key,$config); //基于$dn生成新的 CSR (证书签名请求)
    $sscert = openssl_csr_sign($csr, null, $private_key, 365,$config);//根据配置自己对证书进行签名
    openssl_x509_export($sscert, $csrkey); //将公钥证书存储到一个变量 $csrkey,由 PEM 编码格式命名。
    openssl_pkcs12_export($sscert, $new_private_key, $private_key, $private_key_passwd); //将私钥存储到名为的出 PKCS12 文件格式的字符串。 导出密钥$new_private_key
    
    //生成证书文件
    $fp = fopen($cer_path, "w");
    fwrite($fp, $csrkey);
    fclose($fp);
    //生成密钥文件
    $fp = fopen($pfx_path, "w");
    fwrite($fp, $new_private_key);
    fclose($fp);
    echo '-------------------生产证书END---------------------'.PHP_EOL;
    
    
    echo '----------------------自签名验证-START----------------------'.PHP_EOL;
    // 测试私钥 秘钥
    $private_key_passwd = '123456'; //私钥密码
    $pfx_path = "./test.pfx"; //密钥文件路径
    $priv_key = file_get_contents($pfx_path); //获取密钥文件内容
    $data = "测试数据!"; //加密数据测试test
    //私钥加密
    openssl_pkcs12_read($priv_key, $certs, $private_key_passwd); //读取公钥、私钥
    $prikeyid = $certs['pkey']; //私钥
    openssl_sign($data, $signMsg, $prikeyid,OPENSSL_ALGO_SHA1); //注册生成加密信息
    $signMsg = base64_encode($signMsg); //base64转码加密信息
    
    
    //公钥解密
    $unsignMsg = base64_decode($signMsg);//base64解码加密信息
    openssl_pkcs12_read($priv_key, $certs, $private_key_passwd); //读取公钥、私钥
    $pubkeyid = $certs['cert']; //公钥
    $res = openssl_verify($data, $unsignMsg, $pubkeyid); //验证
    echo $res?'证书测试成功!':'证书测试失败!'; //输出验证结果,1:验证成功,0:验证失败
    var_dump($res);
    echo '-----------------------签名验证-END------------------------',PHP_EOL;

    注释:

    x509,公钥证书,只有公钥。
    p7,签名或加密。可以往里面塞x509,同时没有签名或加密内容。
    p12,含有私钥,同时可以有公钥,有口令保护。
    p7的作用就是电子信封。
    X509是基本规范
    P7和P12是两个实现规范,P7是数字信封,P12是带有私钥的证书规范。
    x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg,大概就这个意思。

    P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。
    P12是把证书压成一个文件,.pfx 。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。
    在实践中要中,用户证书都是放在USB Key中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。

    X509 是证书规范
    PKCS#7 是消息语法 (常用于数字签名与加密)
    PKCS#12 个人消息交换与打包语法 (如.PFX .P12)打包成带公钥与私钥

  • 相关阅读:
    java 数组及数组得内存管理总结
    js 日期格式化
    url获取参数值,支持中文、英文
    C# log4net 的日志代码配置
    js 处理浏览器显示地址
    mui <a>标签跳转失效的处理
    js 实时输入事件
    asp.mvc 页面获取当前请求的控制器和方法
    js 获取元素值
    DllImport System.DllNotFoundException 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)
  • 原文地址:https://www.cnblogs.com/boundless-sky/p/10858037.html
Copyright © 2020-2023  润新知