zoukankan      html  css  js  c++  java
  • [https][openssl] OpenSSL 公钥、私钥以及自签名证书

    转自:https://www.zybuluo.com/muyanfeixiang/note/392079

    简介

    公钥私钥用来互相加解密的一对密钥,一般是采用RSA非对称算法。公钥加密的私钥能解密,私钥加密的公钥能解密。关于公私钥更多内容,网上都有就不详细介绍。

    关于CA证书,是由第三方机构下发的,可以对私钥签名附加上机构信息。浏览器就可以在https协议中通过该证书信任第三分站点。当然也可以自己生成根证书来签发子证书。

     

    操作

     

    生成根证书

    1.首先生成私钥

     
    1. openssl genrsa -out root.key 2048

    该命含义如下: 
    genrsa——使用RSA算法产生私钥 
    -aes256——使用256位密钥的AES算法对私钥进行加密(以忽略) 
    -out——输出文件的路径 
    2048——指定私钥长度 
    2.生成根证书签发申请文件(csr文件)

     
    1. openssl req -new -key root.key -out root.csr -subj "/C=CN/ST=ShangHai/L=ShangHai/O=Yunan International Trust Company/OU=Internet Finance/CN=YNTRUST"

    该命令含义如下: 
    req——执行证书签发命令 
    -new——新证书签发请求 
    -key——指定私钥路径 
    -out——输出的csr文件的路径 
    -subj——证书相关的用户信息(subject的缩写) 
    3.自签发根证书(cer文件)

     
    1. openssl x509 -req -days 3000 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.cer

    该命令的含义如下: 
    x509——生成x509格式证书 
    -req——输入csr文件 
    -days——证书的有效期(天) 
    -sha1——证书摘要采用sha1算法 
    -extensions——按照openssl.cnf文件中配置的v3_ca项添加扩展 
    -signkey——签发证书的私钥 
    -in——要输入的csr文件 
    -out——输出的cer证书文件 
    使用的-extensions值为v3_ca,v3_ca中指定的basicConstraints的值为CA:TRUE,表示该证书是颁发给CA机构的证书。

    到此就完成了根证书的生成。

     

    使用根证书签发服务端证书

    和生成根证书的步骤类似,这里就不再介绍相同的参数了。 
    1.生成服务端私钥(可以给商户客户)

     
    1. openssl genrsa -out private/server-key.pem 2048

    2.生成证书请求文件

     
    1. openssl req -new -key private/server-key.pem -out private/server.csr -subj "/C=CN/ST=ShangHai/L=ShangHai/O=Yunan International Trust Company/OU=Internet Finance/CN=YNTRUST"

    3.使用根证书签发服务端证书(此时证书只有公钥,没有私钥)

     
    1. openssl x509 -req -days 3000 -sha1 -extensions v3_req -CA root_cert/root.cer -CAkey root_cert/root.key -CAserial ca.srl -CAcreateserial -in private/server.csr -out private/server.cer

    这里有必要解释一下这几个参数: 
    -CA——指定CA证书的路径 
    -CAkey——指定CA证书的私钥路径 
    -CAserial——指定证书序列号文件的路径 
    -CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀 
    注意:这里指定的-extensions的值为v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值为CA:FALSE 
    4.将上一步的证书转换为der格式(二进制格式,不能文本打开)

     
    1. openssl x509 -outform der -in test-private/server.cer -out private/publicserver.ccertificate.der
     

    证书格式的转换

    以上生成的公私钥和证书都是PEM格式的,但很多时候不同场景中还需要用到其他格式的证书:

     
    1. p12pfx

    p12/pfx是按照PKCS#12编码的对象,它通常由X.509证书和对应的私钥组成。生成p12格式的方法如下:

     
    1. openssl pkcs12 -export -in server.cer -inkey server-key.pem -out server.pfx

    由于文件中保存了私钥,因此执行该命令,openssl会要求用户输入密码,用于保护私钥。

     

    从私钥导出公钥

     
    1. openssl rsa -in server-key.pem -pubout -outform PEM -out server-key-pub.pem
     

    c#操作签名和验证

     
    1. X509Certificate2 pri = new X509Certificate2(@"D:self_cerfcerts00191400205798.pfx", "123456"); //读取签名私钥
    2. var testData = Encoding.UTF8.GetBytes("liuyanbin");
    3. RSACryptoServiceProvider rsaObj = null;
    4. if (pri.HasPrivateKey)
    5. {
    6. rsaObj = (RSACryptoServiceProvider)pri.PrivateKey;
    7. var signature = rsaObj.SignData(testData, new SHA1CryptoServiceProvider());//使用SHA1算法获得摘要并进行签名
    8. //var pri_pub = (RSACryptoServiceProvider)pri.PublicKey.Key;
    9. //var ss = rsaObj.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);
    10. var rsa = PemKeyUtils.GetRSAProviderFromPemFile(@"D:self_cerfprivateserver-key-pub.pem");//获取公钥
    11. var result = rsa.VerifyData(testData, new SHA1CryptoServiceProvider(), signature);//验证签名
    12. }

    PemKeyUtils代码详见公钥相关代码

     

    -------------------  update @ 20170515  -----------------------------------

    生成带密码的私钥(请注意:这个方法是错误的!!!):

    /home/tong/Keys/https/test [tong@T7] [17:38]
    > openssl genrsa -out server-withpass.pem -passout pass:one1234 2048 
    Generating RSA private key, 2048 bit long modulus
    ....................+++
    ..+++
    e is 65537 (0x010001)

    密码参数的格式: man 1 openssl 

      -------------  4 hours later  ------------

    发现各种诡异问题,始终感觉加密没有成功。。。。。 原来。。。。 真的没有成功。。。尼玛。。。请看 man genrsa 的这一段:

           -aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
               These options encrypt the private key with specified cipher before outputting it. If none of these options is specified no encryption is used. If
               encryption is used a pass phrase is prompted for if it is not supplied via the -passout argument.

    于是,重新修改上边的命令:

    /home/tong/Keys/https/test [tong@T7] [20:46]
    > openssl genrsa -out server-withpass.pem -des3 -passout pass:one1234 2048
    Generating RSA private key, 2048 bit long modulus
    ..+++
    .........+++
    e is 65537 (0x010001)

     怎么验证有没有加密呢?加密成没成功?

    1. 导出一下公钥,如果有加密,一定会和你要密码的

    /home/tong/Keys/https/test [tong@T7] [9:23]
    > openssl rsa -in server-withpass.pem -pubout
    Enter pass phrase for server-withpass.pem:

    2.  cat 一下,就可以看出来了。加了密的和没加密的内容不同

    /home/tong/Keys/https/test [tong@T7] [9:25]
    > cat server-withpass.pem 
    -----BEGIN RSA PRIVATE KEY-----
    Proc-Type: 4,ENCRYPTED
    DEK-Info: DES-EDE3-CBC,83CB22577C5385B6
    
    fwFmtRTl8tZhL7MLOQk0LwaL5IFZWel0x
    ...... ......
    69hch0TG+LsnMdNTkbQtwbBIaZGvafwL2ir7VNxHjM1N0Nw
    -----END RSA PRIVATE KEY-----
    
    /home/tong/Keys/https/test [tong@T7] [9:26]
    > cat server-key.pem 
    -----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEAxImkuzjwDrtKkvGN78/s
    ...... ......
    a55nnYhvTpDqsLZtRFitPTP27q9LDns=
    -----END RSA PRIVATE KEY-----

    更对内容:

    [ipsec][strongswan] 用strongswan pki工具生成自签名证书

    [ipsec][crypto] 有点不同的数字证书到底是什么

     

     

     

     

     

  • 相关阅读:
    idea最新注册码
    pycharm中可以运行脚本(只在控制台运行,Debugger不运行,设置的断点没用)但是不能debug脚本
    VSCode 云同步扩展设置 Settings Sync 插件
    gist.github.com 无法访问解决办法,亲测永远有效!
    C# HttpWebRequest httpclient
    C# 图片处理
    powerdesigner逆向工程生成PDM时的列注释
    Ocelot网关治理
    Consul服务注册与发现
    CentOS 使用DVD1_DVD2作为本地离线的更新源
  • 原文地址:https://www.cnblogs.com/hugetong/p/6845436.html
Copyright © 2011-2022 走看看