热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

P12导出证书证书、私钥一、简言今天与客户做微信支付开发支持,然后给到了相应的商户号、apikey、公众号、p12证书等等。但是客户那边不要P12证书,非要pem证书。所以这边要进

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



推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的间隙锁概念及其作用,探讨了它在解决幻读问题方面的关键角色,并解析了间隙锁与其他操作之间的冲突关系。同时,文章还讨论了next-key-lock的构成及应用,以及在不同场景下的优化策略。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
author-avatar
钟孝健V
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有