秒懂Https之CA证书与自签名证书漫谈
【版权申明】非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/107540565
出自:shusheng007
首发于:shusheng007博客
相关文章:
数字签名的原理及其应用
秒懂Https之如何在Android中使用自签名证书
秒懂https之如何在SpringBoot2中使用自签名证书
文章目录
- 概述
- Https
- 证书
- 自签名证书
- 生成PKCS12格式的KeyStore
- 查看keystore中的信息
- 从keystore到出ssl证书
- 将现有ssl 证书导入到keystore中
- 总结
概述
最近抽时间让APP支持了https的功能,所以总结一下相关的知识,以飨读者。
预备知识:必须对https有基本的理解
Https
HTTPS: Hypertext Transfer Protocol Secure 超文本安全传输协议,太普遍了,列出关键点,不做过多解释。
- 客户端与服务端使用非对称加密将一个秘钥传递给对方。
- 双方使用此秘钥通过对称加密通信。
证书
我们知道非对称加密需要一对秘钥:公钥和私钥。当一方拥有了此秘钥对后,最头疼的事情就是如何将公钥安全的传递给对方。因为通讯过程是不安全的,我们不知道公钥在传递过程中会发生什么(中间人攻击)。此时CA就粉墨登场了,其存在的意义就是确保通信的一方可以安全的获取到对方的公钥。
我们先介绍几个相关名词,然后简单谈一谈CA是如何赚这份钱的。
CA: certificate authority , 负责颁发CA证书的机构和组织,都是一些欧美邪恶组织,轻易不让别人加入。
CA证书:CA机构颁发给其他人的证书。主要包含如下信息
- 申请者公钥
- 申请者的信息
- 颁发者(CA)的信息
- 以上信息的数字签名
数字签名生成规则:先使用摘要算法,例如SHA256,将以上信息生成摘要,然后CA使用自己的私钥对此摘要加密
那CA到底是如何赚这份钱的呢? 简单来说就是CA帮你做担保,担保那个公钥确实是和你通信的那一方的。那他是怎做到的呢?且听我娓娓道来
第一步: CA ,就是那些欧美邪恶组织,先找操作系统厂商以及浏览器厂商,例如微软、Google、Apple等私通苟且,大家关起门来讨价还价一番,最后让这些厂商在自己的操作系统或者浏览器中内置CA的根证书(以及二级证书)。大家约定好,只有能通过这些证书验证的其他证书才是合法的,否则都他娘的不许放行,或者吓唬用户:“系统检测到你访问的地址是不安全的,继续访问有可能被爆菊花…”。
通过这一步就达到了如下效果:你先信任了A,然后通过A去校验未知的B、C、D…
第二步:CA通过这一顿骚操作,就逼得用户需要向CA申请证书了。因为要使用HTTPS就需要公钥私钥对,但是如果你自己产生一对的话,当用户使用浏览器访问你的服务器时,你把公钥传给浏览器,那些内置的CA根证书就去校验你这个公钥,然后大惊失色的告诉用户:“不好!你访问的网站可能是个恶意网站,你有可能被爆菊花…” 经此一吓,大部分用户也就不用你的服务了,长此以往,公司就的解散,到时候下海去做鸭,就真的要被爆菊花了…那首歌怎么唱来着:“一步踏错终身错,下海伴舞为了生活…”
有的同学又要反驳了:你又瞎哔哔,我上12306官网去买火车票时,浏览器就会提示我有可能被爆菊花,但是也没见人家倒闭啊… 你是12306吗?你家卖火车票吗?过年回家的时候别说提示你爆菊花,就是提示你有可能吃屎,你也得点进去抢票啊… 这就是垄断的力量!话说强如12306,最近好像也申请了CA证书了。
王二狗不想去下海,所以鼓动其公司《圣女果科技》向CA申请CA证书,其需要如下步骤
a: 向CA提供公司的公钥,公司信息,域名等信息
b: CA调查并确认这些信息都是真实的
c: 圣女果交钱给CA
d: CA向圣女果颁发证书
让我们看一下这些CA根证书的样子吧:
在Chrome中的某个CA证书
Android中的CA证书列表
有了CA证书,公司就可以正常开展业务了。下面看一下当一个用户访问《圣女果科技》官网时证书的验证流程
第三步: 验证证书流程
设客户端为:C,服务端为:S
C以https方式访问S
S返回其证书SngCer给C
C使用内置CA根证书验证SngCer。 验证过程如下:
将SngCer中明文信息使用相同摘要算法生成摘要得到 digest1;
使用CA根证书中的CA的公钥对SngCer中的数字签名解密得到digest2;
对比digest1与digest2,如果相同则说明SngCer没有被篡改过,而且是CA颁发出去的,可以放心使用其明文信息。验证 SngCer中的那些明文信息,例如证书是否过期,域名是否正确,证书是否被吊销等
通过以上介绍我们发现最开始困扰我们如何传递公钥的问题就这样被解决了:用户无条件信任一个预先安装的公钥。
理解了CA证书,自签名证书就比较好理解了。就是我们自己生成一对公钥私钥,自己用。如果是浏览器访问,就要忍受其安全提示。如果是运行在Android或者IOS设备中的App呢,访问就会失败。
那如何才能不失败呢?浏览器就比较尴尬了,因为浏览器都是别人开发的,你总不能把你的自签名证书导入我电脑上的浏览器中吧。但是在我们自己开发的App中还是可以使用的,写程序完成证书验证过程就好了。
自签名证书
要处理HTTPS相关的问题可以使用大名鼎鼎的 OpenSSL,但是我没怎么用过。其实JDK自带了一个工具keytool
也可以完成。
如果你配置了java的环境变量,可以直接在命令行窗口输入如下命令查看此工具的信息
keytool --help
密钥和证书管理工具命令:-certreq 生成证书请求-changealias 更改条目的别名-delete 删除条目-exportcert 导出证书-genkeypair 生成密钥对-genseckey 生成密钥-gencert 根据证书请求生成证书-importcert 导入证书或证书链-importpass 导入口令-importkeystore 从其他密钥库导入一个或所有条目-keypasswd 更改条目的密钥口令-list 列出密钥库中的条目-printcert 打印证书内容-printcertreq 打印证书请求的内容-printcrl 打印 CRL 文件的内容-storepasswd 更改密钥库的存储口令使用 "keytool -command_name -help" 获取 command_name 的用法
使用keytool
可以生成keystore
, 其是存放 “加密密钥、X.509证书链和受信任证书” 等的数据库。其有多种格式,我们这里使用行业标准格式PKCS12。
生成PKCS12格式的KeyStore
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -ext san=ip:192.168.xx.xx -storepass password
- genkeypair: 产生一个密钥对;
- alias: 产生的keystore的别名;
- keyalg: 密钥对使用的加密算法(alg是algorithm 的缩写);
- keysize: 秘钥长度,此处为2048 bits, 如果需要更安全可以使用 4096 bits;
- storetype: keystore的类型,此处为PKCS12;
- keystore: keystore文件名称;
- validity: 有效期天数,3650表示有效期为10年;
- storepass: keystore的密码.
- -ext 额外信息,此处添加了Subject Alternate Name (SAN) san=ip:192.168.31.25 san后面是你的主机名,域名或者IP。
例如要同时添加域名与IP使用下面的配置:san=dns:shusheng007.top,ip:192.168.10.xxx
如果证书中不把域名或者IP放进去的话,客户端请求的时候需要设置不验证主机名,否则证书验证不过。
执行上面命令后需要你提供一些信息:
您的名字与姓氏是什么?[Unknown]: shusheng007
您的组织单位名称是什么?[Unknown]: sng
您的组织名称是什么?[Unknown]: sng
您所在的城市或区域名称是什么?[Unknown]: tianjin
您所在的省/市/自治区名称是什么?[Unknown]: jinan
该单位的双字母国家/地区代码是什么?[Unknown]: cn
CN=shusheng007, OU=sng, O=sng, L=tianjin, ST=jinan, C=cn是否正确?[否]: y
输入y后回车,就会在你的目录下生成一个keystore.p12
文件,这个文件就是我们的keystore
查看keystore中的信息
在keystore.p12
文件所在目录执行如下命令:
keytool -list -v -storetype pkcs12 -keystore keystore.p12
出现如下信息,输入生成时候的密码,我们这里是shusheng007,回车即可
输入密钥库口令:密钥库类型: PKCS12
密钥库提供方: SunJSSE您的密钥库包含 1 个条目别名: sng
创建日期: 2020-7-23
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=shusheng007, OU=sng, O=sng, L=tianjin, ST=jinan, C=cn
发布者: CN=shusheng007, OU=sng, O=sng, L=tianjin, ST=jinan, C=cn
序列号: 1990d91e
有效期开始日期: Thu Jul 23 21:52:40 CST 2020, 截止日期: Sun Jul 21 21:52:40 CST 2030
证书指纹:MD5: 68:D8:C0:E4:32:35:D0:17:7C:0D:8E:AC:0E:BD:40:3ESHA1: 84:3A:10:7E:16:66:E3:FB:94:5B:16:2A:FD:3C:34:B2:1E:8A:8E:DESHA256: FA:29:C9:66:F0:78:8B:3B:17:1A:B1:40:51:C4:32:AB:4A:D5:FC:B3:98:75:D9:51:5E:EB:7E:40:6D:2E:7F:C0签名算法名称: SHA256withRSA版本: 3扩展:#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [IPAddress: 192.168.31.158
]#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 05 3E 67 C8 B8 D8 04 82 FB 71 F0 35 90 F7 E6 F2 .>g......q.5....
0010: 06 E8 78 1C ..x.
]
]
*******************************************
*******************************************
从keystore到出ssl证书
当我们要在客户端,例如Android,中使用时需要从keystore中导出ssl证书myCertificate.crt
。
keytool -export -keystore keystore.p12 -alias sng -file myCertificate.crt
输入密码后生成ssl证书
输入密钥库口令:
存储在文件 <myCertificate.crt> 中的证书
只要导出了ssl证书,我们就可以在Android中或者浏览器中使用了,如何使用有机会再说。
将现有ssl 证书导入到keystore中
我们前面说过,keystore就是一个容器或者说数据库,所以我们是可以把现有的ssl证书导入其中的。
keytool -import -alias sng -file myCertificate.crt -keystore keystore.p12 -storepass shusheng007
我们尝试将刚生成的ssl证书导入keystore.p12中,结果失败了,因为库中已经有一个一模一样的了。
keytool 错误: java.lang.Exception: 证书回复与密钥库中的证书是相同的
总结
行文到此又该结束了,本文讲述了CA证书的工作原理,以及如何生成自签名证书,相信你又get到不少新技能,注意点赞收藏,用时回看。
等有时间我会将如何在前(Android)后端(SpringBoot2)中使用自签名证书总结出来,让其他小伙伴少走弯路,点赞超过50就开写,敬请期待!
参考文章:
https://www.cnblogs.com/handsomeBoys/p/6556336.html
https://www.jianshu.com/p/29e0ba31fb8d
秒懂Https之CA证书与自签名证书漫谈相关推荐
- iOS开发HTTPS实现之信任SSL证书和自签名证书
首先来分析一下什么是HTTPS以及了解HTTPS对于iOS开发者的意义 HTTPS 以及SSL/TSL 什么是SSL? SSL(Secure Sockets Layer, 安全套接字层),因为原先互联 ...
- 沃通开年采购季,SSL证书、代码签名证书特惠低价,助力保障关键数据安全
近期<关键信息基础设施安全保护条例>.<网络安全审查办法>等一系列政策的实施,今年国家对网络数据安全将更为重视,如何构建网络安全体系.保障企业数据安全将会是今年众多企业的重点工 ...
- 关于天威诚信数字认证中心_VeriSign在中国大陆区SSL证书和代码签名证书市场份额中有95%来自天威诚信...
北京天威诚信电子商务服务有限公司(iTruschina)是经信息产业部批准的全国性PKI/CA企业,是专门从事数字信任服务.PKI/CA建设服务.PKI/CA应用服务.PKI/CA运营管理咨询服务和P ...
- 关于VeriSign(威瑞信)_VeriSign(威瑞信)全球服务网络遍及全球,面向各地客户提供PKI及SSL证书、代码签名证书服务...
VeriSign(威瑞信)公司成立于1995年,总部在美国加州山景城. 公司于1998年上市,是标普500指数之一.威瑞信公司提供的整套安全在线交易服务保障个人和公司放心从事数字交易活动.其中保护网站 ...
- 解决https网站通过nginx+openssl自签名证书访问,在谷歌浏览器报不安全告警的问题
一.背景描述: 遇到需要从http跨协议访问https的情况,此时就需要对要访问的https网址生成自签名证书,但是在谷歌浏览器中会报不安全的告警,必须手动操作下才能最终访问到https网址,很是麻烦 ...
- OpenStack 给nova组件 vnc 配置https(SSL)自验证签名证书
先说解决办法以及结果 解决办法:Nginx 转发 结果:只转发 生成vnc 的console 地址,拼凑出https,能在Https web应用即可,比如把console url (控制台地址)ifr ...
- 自签名证书说明——自签名证书的Issuer和Subject是一样的。不安全的原因是:没有得到专业SSL证书颁发的机构的技术支持?比如使用不安全的1024位非对称密钥对,有效期设置很长等...
一般的数字证书产品的主题通常含有如下字段: 公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名:而对于代码签名证书则为申请单位名称:而对于客户端证书则为证书申请 ...
- Windows系统openssl颁发根证书以及下签子证书和代码签名证书
此文章转载自我的博客GoodBoyboy 1.首先创建根证书 (1)生成私钥 openssl genrsa -aes256 -out root.key 2048 然后输入私钥密码 生成root.key ...
- 私钥创建,申请证书,吊销证书,创建自签名证书
CentOS7 中使用 gpg 创建 RSA 非对称密钥对 gpg --gen-key #在最后需要对设备进行操作的时候,可以在打开一个终端,然后 dd if=/dev/sda of=/dev/nul ...
- linux安装globalsign证书,globalsign代码签名证书
GlobalSign代码签名证书被平台上的开发人员使用来对通过Internet 分发的应用程序和软件进行数字签名. 因为签名的代码包括发布者的名称以及该代码自发布以来未被篡改的保证,任何人从互联网下载 ...
最新文章
- MIPS(loongson)linux 中添加系统调用
- 一款开源免注册的加密工具,防火防盗防泄密~
- 【Python】一文掌握Conda软件安装:虚拟环境、软件通道、加速solving、跨服务器迁移...
- mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
- SaltStack 学习笔记 - 第六篇: 详解Pillar
- 给UIWebView增加搜索栏
- Linux 内核红黑树分析
- 科普:手机里的陀螺仪到底是什么
- ARM汇编加载/存储指令
- Bailian2708 平衡饮食【序列处理】
- idea 读取md文件卡死
- 电子电路计算机仿真应用,电力电子电路的计算机仿真
- 转发: 安全百科 DNS欺骗
- 荣耀绽放 | 白玉兰酒店荣膺金光奖“中国发展潜力酒店品牌”奖项
- “如果Java受到一两个大型供应商的控制,则可能会遭受挫折”
- 计算机的USB接口可以扩展吗,电脑的USB接口不够用怎么办?别急,我来支招!
- 解决浏览器突然上不了网的问题
- Android安卓开发基础-Button与ImageButton
- 对抗机器学习:Generating Adversarial Malware Examples for Black-box Attacks Based on GAN
- linux基本功系列之uptime命令实战