热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析OpenSSL生成SM2证书:非对称加密技术与数字证书、数字签名的关联分析

本文深入探讨了OpenSSL在生成SM2证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了OpenSSL如何利用这些原理生成SM2证书,并讨论了其在实际应用中的安全性和有效性。


非对称加密(一句话概括)



f9e71fd71bebb35408e5204cf4cedc6c.png

给你一把打开的锁,用它锁住重要的东西寄回给我,钥匙我自己留着谁也不给。


锁=公钥;钥匙=私钥


公钥就是下面这东西


-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8sBFht3URDLrQrJ/CCUe3zrIJQPYJuBUMfnXV11aV38NEFvzr2I89MAsv7PBl0yEusAhsoOssZuaqRpUatMoScqy8Ap0c0yAD3OY2SjFeqWdn7p2qjRjBLjVwGwA5gRDaX34Yo/r8fGq9WwDPQTkya5paVkyiyROU9q/q8XppGQIDAQAB-----END PUBLIC KEY-----

私钥就是这东西


-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALywEWG3dREMutCsn8IJR7fOsglA9gm4FQx+ddXXVpXfw0QW/OvYjz0wCy/s8GXTIS6wCGyg6yxm5qpGlRq0yhJyrLwCnRzTIAPc5jZKMV6pZ2funaqNGMEuNXAbADmBENpffhij+vx8ar1bAM9BOTJrmlpWTKLJE5T2r+rxemkZAgMBAAECgYAfAUuJ5Ax/hbj46zTBPKclQ/irXppPVIlY6TrRrbXToNZETQa4dnhrFIbyFBwYj03njxODThn2zN3gYwLDRavifal7t07LvE7fwv84QCB4V0/v3WDDex+jCd3HjikiDG48ugC5uZk2Zmz+6DVHTfisr/IaTFaZwnar1Fx2IIY50QJBAO9SdP68hUuk8OROjQixbK3AT0ANVCf4lig6eC/yyWzYIpMda+lwFrcA2Zm4P5lTl4czpH6axKZGlqiUJPkS5K0CQQDJ1klfn/R5m3Mnx7jdo/jt+izVP+WHTpEoz4DYkLmp2+6umrt1pymTyszJVnSfB8wV2hHablROAgWH8E5+LzedAkEAoadk95yHvSzQuqaEhVazPjokTfOy4Lz9UHcOL/UjMa5czFqXRbs83KhqU3ctHnhkZiLv/cS1CEuuAHjw8H1ekQJAeo+49mw3FDEk+B77TvtnCXtFBilKw6Md2l5GqzsWwuJeSYCEHKlpQel/+TKalocxkoNdG/qrDsODgEyYHV+msQJAPJdy7pwMC8IYR8yOGr79R4lK85u1q6bGbZGuqBfnUb7GfuEDIwTgn7wFzFybp/sCzwlSXwpjvp+SsYi+oAgQmQ==-----END PRIVATE KEY-----

具体指的是加、解密使用不同的密钥,一把作为公开的公钥,另一把作为私人保留的私钥。公钥加密的信息,只有私钥才能解密。反之,私钥加密的信息,只有公钥才能解密。


再举个例子,你向某公司服务器请求公钥,服务器将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人才能对你的消息解密。


与对称加密不同的是(指的是加解密使用同一串密钥,常见的对称加密算法有:DES、AES等。),公司服务器不需要将私钥通过网络发送出去,因此安全性大大提高。



d5b26fadb577a12ae95e741f28ee1b47.png

最常用的非对称加密算法:RSA(RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。)


那么有了一些概念后,我们来代入,加密过程是怎么样?解密过程是怎么样?


先介绍个软件,GPG(一款免费软件,由自由软件基金会开发,全称:GnuPG)。


重要功能命令有:


gpg --gen-key#生成自己的密钥,需设定长度(长度越长越安全)、有效期、用户标识(姓名、邮件、注释)、私钥密码(防止系统入侵,或非法使用私钥,相当于给私钥在加层保护)

生成后,系统会提示:



  gpg: 密钥 EDDD6D76 被标记为绝对信任


  公钥和私钥已经生成并经签名。



请注意上面的字符串"EDDD6D76",这是"用户ID"的Hash字符串,可以用来替代"用户ID"。


这时,最好再生成一张"撤销证书",以备以后密钥作废时,可以请求外部的公钥服务器撤销你的公钥。


gpg --gen-revoke[用户ID]#生成撤销证书,防止以后密钥需要作废,可以使用该撤销证书撤销公钥。

gpg --import test.key#撤销本地证书

gpg -send-keys[ID]#将被撤销的公钥ID发送到CA,即可撤销服务器上的公钥。

gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net#上传公钥至对应密钥管理服务器(可以是公网托管服务器也可以是自己布署的私有CA)

gpg --recipient [用户ID] --output demo.en.txt --encrypt demo.txt#recipient后跟着接收者的公钥,即此文件接收方。

gpg --decrypt demo.en.txt --output demo.de.txt#接收者收到后,即可解密。

gpg --sign demo.txt#有时不需要加密,只需要证明该文件由我发出,就需要用到签名

运行上面的命令后,当前目录下生成demo.txt.gpg文件,这就是签名后的文件。这个文件默认采用二进制储存,如果想生成ASCII码的签名文件,可以使用clearsign参数。


gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt#签名+加密

local-user参数指定用发信者的私钥签名,recipient参数指定用接收者的公钥加密,armor参数表示采用ASCII码形式显示,sign参数表示需要签名,encrypt参数表示指定源文件。


gpg --verify demo.txt.asc demo.txt#收到签名文件后,可以使用对方公钥来验证,参数为verify

了解底层生成方法后,我们来看看数字证书和数字签名的关系


可视化的数字证书长这样



718314a561ac88bcdbee6f739c69c8e6.png


522932e14f1791c05d50a34267d14188.png

可以看到颁发者为:DigiCert Global Root CA,颁发给了自己,有效期为25年,如同上面所提到的GPG命令一样,设置了有效期、算法、长度等信息。


PS:除了GPG,还有其他开源工具,如OpenSSL,也可以生成证书。


如何生成?


生成要区分公网和私网环境,如果需要发布到公网就需要向对应的可信任CA机构申请,这样你申请的证书才会在公网上被认可,私网可以自己搭建CA,比如GPG或OpenSSL等开源工具部署,最后手动添加信任即可。


作用?


可以用于网页传输、电子邮件传输、软件安装包等,确保数据交互时,不会被窃听或篡改。


可视化数字签名长这样



d34ec966256f27589d0c0f3896d1d55a.png

软件安装包一般都会有证书内嵌,如果没有签名的话一安装就会提示这样:



14de253f029f4e23487414a2f630edcb.png

这是因为该软件没有内签,所以Microsoft会有安全提示,当然你可以直接运行,但是该安装包因为没有权威机构签名,所以可能有未知风险。



0ce66a6bdea37a033788f90d9fb07ff5.png

另外在此路径可以查看到系统所有受信任的根证书颁发机构,当然你也可以手动添加。(注:根证书所签发的所有证书均默认被信任,所以自己添加根证书请谨慎。)


程序怎么签名?



33ce45de613bc394d375550c1f1aa0bd.png

以微软系统举例,使用SignCode.exe,根据步骤,将公、私钥导入,选择加密算法、时间戳等,即可将安装包进行签名。


那如果是文件签名的话,请参照上方GPG命令,签名过程是这样的:


A:发送文件B用户,确保由A发送


A:将文件Hash后,得到概要(固定长度)


A:将概要使用私钥加密


A:将加密后的概要、原文件、公钥三者发送 给B用户


B:收到原文件,使用相同Hash算法后得到概要


B:使用A的公钥解密加密后的概要


B:比对概要,无差别即为A签名的文件。


作用?


确保文件或软件、数据由对应签名者发送,未被篡改。


以上。


最后:


个人的学习见解,希望有技术大佬可以多多指正。




推荐阅读
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • Sublime Text 3 注册密钥及激活方法详解
    本文详细介绍了Sublime Text 3的注册密钥获取与激活方法,旨在帮助用户合法且高效地使用这款强大的文本编辑器。文章不仅提供了最新的注册密钥信息,还涵盖了详细的激活步骤,确保用户能够顺利激活软件,享受其带来的便捷与高效。此外,文中还简要对比了Sublime Text 3与其他主流文本编辑器的功能差异,为用户提供更多选择参考。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • HTML 页面中调用 JavaScript 函数生成随机数值并自动展示
    在HTML页面中,通过调用JavaScript函数生成随机数值,并将其自动展示在页面上。具体实现包括构建HTML页面结构,定义JavaScript函数以生成随机数,以及在页面加载时自动调用该函数并将结果呈现给用户。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 首篇待优化改进的文章
    本文介绍了多种常用的矩阵类型及其生成方法,包括单位矩阵、全零矩阵、全1矩阵以及均匀分布的随机矩阵。此外,还探讨了生成随机Markov矩阵的技术,并详细解释了线性等分向量和对数等分向量的构建方式,以及矩阵对数运算的应用。这些内容为数值计算和数据处理提供了坚实的基础。 ... [详细]
author-avatar
寻找初心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有