• 第一章 P12类型证书导出证书、私钥


    P12导出证书证书、私钥

    一、简言

    今天与客户做微信支付开发支持,然后给到了相应的商户号、apikey、公众号、p12证书等等。但是客户那边不要P12证书,非要pem证书。所以这边要进行P12证书导出公钥、私钥操作。
    
    p12证书全称是PKCS#12(Public-Key Cryptography Standards:公钥加密标准,PKCS#12是一种交换数字证书的加密标准,用来描述个人身份信息。如:用户公钥、私钥、证书等。
    
    微信的p12证书里包含了公钥、私钥、证书、序列号。提取这些信息的时候需要输入密码,这个`密码默认是商户号`(这个是重点,这边由于证书时间长,已经不记得密码,查了文档才知道密码默认是商户号)。
    

    二、Linxu具体操作

    #1.查看所有信息
    [root@test01 ~]# openssl pkcs12 -info -in apiclient_cert_shanxi_app.p12 -nodes
    Enter Import Password:
    MAC Iteration 1
    MAC verified OK   #表示密码是正确的
    
    #2.导出证书
    [root@test01 ~]# openssl pkcs12 -in apiclient_cert_shanxi_app.p12 -out cert.pem -nokeys
    Enter Import Password:
    MAC verified OK
    
    #3.导出秘钥
    [root@test01 ~]# openssl pkcs12 -in apiclient_cert_shanxi_app.p12 -out private_key.pem -nodes -nocerts
    Enter Import Password:
    MAC verified OK
    
    #4.查看是否生成证书和密钥
    [root@test01 ~]# ll
    total 44
    -rw-r--r--  1 root root 2718 Jun 18  2021 apiclient_cert_shanxi_app.p12
    -rw-r--r--  1 root root 1923 Jul 15 15:31 cert.pem
    -rw-r--r--  1 root root 1865 Jul 15 15:32 private_key.pem
    
    #5.查看证书序列号
    [root@test01 ~]# openssl x509 -in cert.pem -noout -serial
    
    至此操作结束,把相应的证书和密钥发给开发就好啦。
    

    三、Python具体操作

    # !/usr/bin/env python3
    # -*- coding:utf-8 -*-
    """
    @Version: 3.9
    @Author: Jin Hui
    @File: p12.py
    @Time: 2022-07-15 12:55
    """
    from OpenSSL import crypto
    
    # open it, using password. Supply/read your own from stdin.
    p12 = crypto.load_pkcs12(open('C:/Users/97408/Desktop/apiclient_cert_shanxi_app.p12', "rb").read(),
                             '*********'.encode('ascii'))
    
    cer = p12.get_certificate()  # (signed) certificate object
    pkey = p12.get_privatekey()  # private key.
    ca_cer = p12.get_ca_certificates()  # ca chain.
    print(cer, pkey, ca_cer)
    
    print('版本', cer.get_version())
    print('签名算法', cer.get_signature_algorithm())
    print('序列号:', cer.get_serial_number())
    print('证书是否过时:', cer.has_expired())
    print('在此以前无效:', cer.get_notBefore())
    print('在此以后无效', cer.get_notAfter())
    
    # 主题名称
    subject = cer.get_subject()
    s_components = subject.get_components()
    print(s_components)
    
    key_dict = {'UID': '用户 ID',
                'CN': '经常使用名称',
                'OU': '组织单位',
                'O': '组织',
                'C': '国家或地区'
                }
    
    for (key, value) in s_components:
        print(key, value)
        print(key_dict.get(key.decode(), key))
    
    # 签发者名称
    suer = cer.get_issuer()
    print(suer.get_components())
    
    # 证书扩展信息
    print('扩展数:', cer.get_extension_count())
    print('扩展1:', cer.get_extension(0))
    
    # PEM formatted private key
    private_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())
    with open("private_key.pem", mode='wb') as f1:
        f1.write(private_key)
    
    # PEM formatted certificate
    certificate = crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
    with open("cert.pem", mode='wb') as f2:
        f2.write(certificate)
    
    运行完成后看到多出两个文件证书和密钥。
    

    image

  • 相关阅读:
    使群辉支持NTFS(未完善)
    docker 解决 Dockerfile同级文件有其他文件 导致docker build包越来越大
    nginx location配置前后端地址
    前端 Umi框架自带的proxy功能请求后端地址
    linux常用命令
    arthas的使用(正常部署+服务docker部署)
    linux
    oracle行转列,列转行函数的使用(listagg,xmlagg)
    oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列 ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据
    oracle merge into用法
  • 原文地址:https://www.cnblogs.com/jhno1/p/16481949.html
Copyright © 2020-2023  润新知