一文弄懂关于证书,签名,ssl,android包签名机制。

所有的概念都基于一个非常重要的基础:

rsa 非对称加密算法

先感受下几个概念

PKI。

PKI是公钥基础设施(Public Key Infrastructure) 包括PKI策略、软硬件系统、证书机构CA、注册机构RA、证书发布系统和PKI应用等。

我们关注就俩东西: PKCS 证书机构CA 。前者是定义加密算法,签名,证书相关的各种事情采用的协议。后者可以为我们颁发权威的证书。

PKCS
PKCS(The Public-Key Cryptography Standards )是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。RSA算法可以做加密、解密、签名、验证,还有RSA的密钥对存储。这些都需要标准来规范,如何输入,如何输出,如何存储等。

PKCS。全称是公钥密码学标准, 目前共发布过 15 个标准,这些标准都是协议。总结一下 就是对加密算法,签名,证书协议的描述。下面列举一些常用的协议,这些协议在本文都会对应上。

这些协议具体的实现就体现在openssl等工具中, 以及jdk工具keytool jdk java第三方库bouncycastle。

比如用openssl 如何生成公/私钥(PKCS#1)、签名(PKCS#1 )、签名请求文件(KCS#10)、 带口令的私钥(PKCS#8)。 含私钥的证书(PKCS#12)、证书库(PKCS#12)

其中涉及到算法的基础协议PKCS#1等,由于涉及到密码学原理所以我们并不需要深究它,只要知道怎么做就可以了。

现实中我们要解决这样一种情况:

客户端和服务器之间的数据要进行加密。需要两个达成同一个对称秘钥加密才行,那么这个秘钥如何生成,并在两边都能拿到,并保证传输过程中不被泄露。 这就用到非对称加密了。 后续的传输,就能用这个 对称秘钥来加密和解密了。

还有这样一个问题:

就是客户端如何判断服务端是否是合法的服务端。这就需要服务端有个id来证明它,而这个id 就是证书,而且必须是权威机构颁发的才能算是合法的。
因为客户端即浏览器,认定证书合法的规则必须通过第三方来确认 即ca颁发的证书。否则就我可能进了一个假网站。

而这两个问题 都是ssl协议要解决的内容。

所以ssl协议做了两件事情,一是验证身份,二是协商对称秘钥,并安全的传输。 而实现这个过程的关键数据模型就是证书, 通过证书中的ca对证书的签名,实现了身份验证,通过证书中的公钥,实现对对称秘钥加密,从而实现数据保密。 其实还顺手做了一件事情就是通过解密签名比对hash,保证了数据完整性。

明白ssl协议 首先明白几个重要的概念:

证书: 顾名思义就是提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书, 就是可以认定是合法身份的。客户端不需要证书。 证书是用来验证服务端的。

一般的证书都是x509格式证书,这是一种标准的证书,可以和其他证书类型互相转换。完整来说证书包含,证书的内容,包括 版本号, 证书序列号, hash算法, 发行者名称,有效期, 公钥算法,公钥,签名(证书原文以及原文hash一起签名)而这个内容以及格式 都是标准化的,即x509格式 是一种标准的格式。

签名: 就用私钥对一段数据进行加密,得到的密文。 这一段数据在证书的应用上就是 对证书原文+原文hash进行签名。
谁签的名,就是用谁的私钥进行加密。就像身份证一样, 合法的身份证我们都依据是政府签的,才不是假证, 那就是浏览器会有政府的公钥,通过校验(解密)签名,如果能够解密,就可以确定这个就是政府的签名。就对了。

hash算法 :对原始数据进行某种形式的信息提取,被提取出的信息就被称作原始数据的消息摘要。比如,MD5和SHA-1及其大量的变体。 hash算法具有不可逆性,无法从摘要中恢复出任何的原始消息。长度总是固定的。MD5算法摘要的消息有128个比特位,SHA-1算法摘要的消息最终有160比特位的输出。

ca机构: 权威证书颁发机构,浏览器存有ca的公钥,浏览器以此公钥来验证服务端证书的合法性。

证书的获取: 生成证书申请文件.csr(涉及到PKCS#10定义的规范)后向ca机构申请。 或者自己直接通过生成私钥就可以一步到位生成自签名证书。 自签名证书就是用自己的私钥来签名证书。

那么为了体现到 证书身份认证、数据完整、保密性三大特性 ,证书的简化模型可以认为包含以下两个要素:服务器公钥,ca的签名(被ca私钥加密过的证书原文+原文hash),

身份认证:
浏览器存有ca公钥,用ca公钥解密网站发给你的证书中的签名。如果能解密,说明该证书由ca颁发,证书合法。 否则浏览器就会报警告,问你是否信任这个证书,也就是这个网站。这时候的证书可以是任何人签发的,可以自己签发的。 但是中间人攻击。 完全伪造新的证书, 这就没有办法了。 所以还是信任证书的时候要谨慎。

数据完整:
如果你信任该证书的话,这时候就会用证书中的公钥去解密签名,如果是ca签发的证书,那么之前就已经通过ca的公钥去解密签名了。 然后得到证书hash,然后在浏览器重新对证书做hash,两者比对一致的话,说明证书数据没有被篡改。

保密性:
使用证书的公钥对对称秘钥加密保证传输安全,对称秘钥生成后,后续的传输会通过对称秘钥来在服务端和客户端的加解密。

那么ssl协议的具体过程就是:

4.网站接收浏览器发来的数据之后 使用自己的私钥校验签名,并对原文进行hash 与解密出的hash 做比对检查完整性。然后发送编码改变通知,服务器握手结束通知(所有内容做hash )。 发送给客户端校验。

5 客户端校验,校验成功后,之后就用 对称秘钥进行通信了。

总共的过程是 c-s-c- s-c 四次握手。

四次握手简单来说分别是:
1.请求获取证书
2.服务端返回证书,客户端验证了证书的合法性和完整性,同时生成了对称秘钥。
3.客户端把加密的 对称秘钥发给服务器。服务器检查真实性和完整性。
4.服务端返回握手结束通知,客户端再检查一次真实性和完整性。

前两次握手是明文, 后两次握手是密文。 所以都要检查身份真实性和数据完整性。

ca的作用:
ca起到一个权威中间人的角色,如果脱离了ca, 那么证书还是证书,还能加密,保证数据完整性。 但是无法应用在客户端去认定服务器身份合法这个场景下。

  

下面就详细说下 脱离了ca签发的证书的应用:
  

自签名证书:

证书如果没有权威机构的签名,就是没有权威机构给你签发身份证。 那么这时候身份认证的场景变了。
这时候的认证场景就变成了,不再是某个官方权威说了算,而是假设第一次碰到这个证书,会认为,这个证书与之捆绑的实体之间是合法的并做记录。如果当这个实体下次捆绑了另一个证书,那么就是非法的。

这种情况常用于android中安装和校验app的时候,会先假设第一次安装的是合法的应用,认定这个app证书中的公钥是合法的公钥。然后通过自签名的证书,校验签名,就能实现后续安装是否合法以及完整性。

android中的如何对app进行身份认定和不被篡改:

android系统在安装app时候会进行校验applicationId,applicationId 不同会认定为不同应用。相同应用,第二次安装会校验证书是否和之前app的证书相同,如果相同则两个包很可能来自同一个身份。 如果证书不同,也就是该包被另一个身份用自己的私钥重新签名过,就会拒绝安装。 然后通过公钥来解密签名,如果能解密,说明身份是ok的。否则拒绝安装。比对解密签名后的hash 与apk包内的cert.sf文件(该文件是apk内所有文件生成的hash文件)是否一致,如果相同则认定为没有被篡改。

android在提交应用商店的问题:

应用商店也会校验 后续的上传和第一次上传时的证书,以及类似上述的后续的一系列校验。防止合法的开发者平台被盗后,上传非法应用。

android在接入第三方sdk的问题:

接入第三方sdk 会提交applicationId 和 sha1 值。 这个sha1值就是对 证书原文的签名后的sha1,也就是证书指纹。这个证书是证书库里最初的那个证书(x509格式),而不是对apk签名后生成的证书(PKCS#7)。一般的证书签名的主体是证书原文本身,而对apk签名还额外会对apk所有文件生成的hash值文件(cert.sf)进行一次签名。

第三方平台会记录 applicationId 与sha1 的对应关系。 当有假冒app试图接入时候,由于会对app内的PKCS#7证书转换为原始的x509格式证书,重新生成sha1值,与用户提交sha1 比对, 如果相同则说明证书很可能是ok的。 因为sha1就是证书的指纹。 之后就会通过证书中的公钥来校验签名,从而最终确认身份合法性以及信息完整性。

第三方平台之所以需要用户去提交证书指纹sha1值,多了这一步,就意味着你的证书是可以更换的,一旦更换了证书,就必须提交新的指纹给我,然后我来做匹配。而应用商店没有这个功能, 一旦你的证书的私钥丢了, 那就必须重新建一个新的app。

总结来看证书的身份认定机制:

在ssl协议下,这种场景是 浏览器用于认定合法的服务器身份。 在自签名证书下,需要用户选择是否信任该证书。

在android app采用自签名证书的场景下, 证书起到了 假设第一次的证书合法,公钥合法,后续如果证书不一致或不能够完成签名校验,就是非法。

证书库:

证书库应该满足PKCS#12协议。 但是jdk提供了制作证书的工具keytool 可以生成keystore类型的证书库,后缀为jks。 keystore pk12可以通过keytool命令互相转换。

证书库是个证书的容器, 可以用来创建数字证书。 在keystore证书库中,所有的数字证书是以一条一条(采用别名alias区别)的形式存入证书库的。证书库中的证书格式为pk12,即包含私钥。 如果导出证书的话, 可以导出为x509不包含私钥的格式 或者pk12包含私钥的证书。 也可以也可以用-import参数加一个证书或证书链到信任证书。

android中一般都采用读取证书库的方式,通过证书库来创建一个证书,通过alias来区分。 所以在签名的时候,一个alias是一个证书,不同的alias是不同的证书,不要搞错了。

几个关系:

证书和非对称加密算法的关系:
证书代表一个身份的主体,包含了非对称秘钥体系中的公钥,以及用私钥对证书签名。这种组织结构,把非对称加密算法从加密的功能,拓宽到了用于身份认证,信息完整性上。这体现在了证书的作用。 本质还是利用了非对称加密算法的特性。

ssl协议和证书的关系。
因为证书解决了客户端对服务器的身份认证(自签名证书除外),同时也解决了加密,和信息完整性,所以ssl协议基于证书来实现。



  • 涓鏂囧紕鎳傚叧浜庤瘉涔,绛惧悕,ssl,android鍖呯鍚嶆満鍒躲
    绛旓細PKCS(The Public-Key Cryptography Standards )鏄敱缇庡浗RSA鏁版嵁瀹夊叏鍏徃鍙婂叾鍚堜綔浼欎即鍒跺畾鐨勪竴缁勫叕閽ュ瘑鐮佸鏍囧噯,鍏朵腑鍖呮嫭璇佷功鐢宠銆佽瘉涔︽洿鏂般佽瘉涔︿綔搴熻〃鍙戝竷銆佹墿灞曡瘉涔﹀唴瀹逛互鍙婃暟瀛绛惧悕銆佹暟瀛椾俊灏佺殑鏍煎紡绛夋柟闈㈢殑涓绯诲垪鐩稿叧鍗忚銆俁SA绠楁硶鍙互鍋氬姞瀵嗐佽В瀵嗐佺鍚嶃侀獙璇,杩樻湁RSA鐨勫瘑閽ュ瀛樺偍銆傝繖浜涢兘闇瑕佹爣鍑嗘潵瑙勮寖,濡備綍杈撳叆,濡...
  • 鎶鏈垎浜 | MySQL:涓鏂囧紕鎳鏃跺尯&time_zone
    绛旓細system_time_zone 鍙橀噺鍙湁鍏ㄥ眬鍊兼病鏈変細璇濆硷紝涓嶈兘鍔ㄦ佷慨鏀癸紝MySQL 鍚姩鏃讹紝灏嗗皾璇曡嚜鍔ㄧ‘瀹氭湇鍔″櫒鐨勬椂鍖猴紝骞朵娇鐢ㄥ畠鏉ヨ缃 system_time_zone 绯荤粺鍙橀噺锛 姝ゅ悗璇ュ间笉鍙樸傚綋 time_zone='system' 鏃讹紝灏辨槸浣跨敤鐨勮繖涓椂鍖猴紝绀轰緥涓 time_zone 灏辨槸 CST锛岃 CST 鍦 RedHat 涓婂氨鏄笢鍏尯锛氭鎷竴涓嬪氨涓...
  • 涓鏂囧紕鎳,鍏ㄧ悆鏂板啝鐤嫍鐮斿彂鍒颁粈涔堢▼搴︿簡?
    绛旓細瑕佷簡瑙f洿澶鍏充簬鏂板啝鐤嫍鐨勬繁鍏ヨВ璇伙紝鍙互鍙傝僛鏂囩尞1](https://vk.ovg.ox.ac.uk/vk/types-of-vaccine)銆乕2](https://www.livescience.com/coronavirus-protection-using-tuberculosis-vaccine.html)銆佷互鍙娿5澶ц禌閬撲腑鍥界柅鑻楅」鐩39涓嬪拰姣曞鐨刐瑙嗛](https://www.bilibili.com/video/BV1c74y1m7Q5...
  • 涓鏂囧紕鎳鍗囧濡備綍鍙樻洿鐢熸簮鍦板姪瀛﹁捶娆惧氨瀛︿俊鎭!
    绛旓細鍙樻洿鐢熸簮鍦板姪瀛﹁捶娆惧氨瀛︿俊鎭殑姝ラ濡備笅锛 1銆佸鐢熸惡甯︽湰浜鸿韩浠借瘉鍙婄澹綍鍙栭氱煡涔﹀墠寰鍘跨骇璧勫姪涓績锛屽彉鏇寸敓婧愬湴鍔╁璐锋灏卞淇℃伅锛 2銆佸幙绾ц祫鍔╀腑蹇冩牳瀵圭浉鍏虫潗鏂欐棤璇互鍚庯紝閫氳繃鐢熸簮鍦拌捶娆剧鐞嗙郴缁熷彉鏇村悎鍚岃创鎭捣姝㈡棩銆佸闄愭湡鍜屽埌鏈熸棩绛変簨椤癸紱 3銆佺瓑寰呭浗瀹跺紑鍙戦摱琛屼簣浠ュ鏍搞佹壒澶嶅悗锛岀浉鍏充俊鎭墠浼氭寮...
  • 缇庤仈鍌ㄦ棤闄愰噺瀹芥澗鏄粈涔?涓鏂囧紕鎳瀹!
    绛旓細缇庤仈鍌ㄨ〃绀猴紝灏嗚嚧鍔涗簬鍦ㄨ繖涓鍏呮弧鎸戞垬鐨勬椂浠o紝浣跨敤鍏跺叏閮ㄥ伐鍏锋潵鏀寔缇庡浗缁忔祹锛屼粠鑰屼績杩涘叾鏈澶у氨涓氬拰浠锋牸绋冲畾鐨勭洰鏍囥 閫氫織涓鐐规潵璇达紝灏辨槸缇庤仈鍌ㄥ皢涓嶉檺瀹氭暟閲忕殑瀵瑰璐拱閲戣瀺璧勪骇锛屾姇鏀剧編鍏冿紝澧炲姞甯傚満涓婄殑缇庡厓鏁伴噺銆傚彲鑳戒骇鐢熺殑褰卞搷 浠庣悊璁轰笂璁诧紝缇庤仈鍌ㄦ棤闄愰噺瀹芥澗鍚庯紝甯傚満涓婄殑缇庡厓渚涘簲閲忓鍔狅紝娴佸姩鎬ф敼...
  • 涓鏂囧紕鎳澶╂触涔版埧璧勬牸!鐪嬬湅浣犳槸鍚﹁兘涔版埧浜!
    绛旓細澶╂触涔版埧璧勬牸 1銆佸叿鏈夊ぉ娲ユ埛绫嶇殑瀹跺涵锛屽湪鏈競宸叉嫢鏈1濂椾綇鎴跨殑杩樺彲浠ヨ喘涔1濂楋紱宸叉嫢鏈2濂椾綇鎴跨殑涓嶅彲浠ュ啀璐拱浣忔埧浜嗐 2銆佸闈炲ぉ娲ユ埛绫嶇殑瀹跺涵锛屽叿浣撹瀹氬涓嬶細 (1)鍦ㄥぉ娲ユ病鏈変綇鎴夸笖鍦ㄥ姙鐞嗘埧鍦颁骇鏉冨睘杞Щ鐧昏鏃讹紝鑳藉鎻愪緵3骞村唴杩炵画缂寸撼2骞翠互涓(鍚2骞)鍦ㄥぉ娲ョ即绾充釜浜烘墍寰楃◣绾崇◣璇佹槑鎴栫ぞ浼氫繚闄...
  • 涓鏂囧紕鎳,2018骞村箍宸炲叕绉噾璐锋鏈楂橀搴︽槸澶氬皯!
    绛旓細骞垮窞鍏Н閲戣捶娆炬渶楂橀搴 涓浜猴細涓浜虹殑鏈楂樿捶娆鹃搴︿负60涓囧厓銆 澶涓や汉锛氬か濡讳袱浜鸿喘涔板悓涓浣忔埧鐢宠浣忔埧鍏Н閲戣捶娆撅紝鏈楂樿捶娆鹃涓100涓囧厓銆 鍙互鐪嬪嚭锛屽嵆浣挎槸澶涓や汉鍏卞悓浣跨敤鍏Н閲戣捶娆撅紝100涓囧厓鐨勬渶楂樿捶娆鹃搴﹀湪骞垮窞鍦板尯鏉ヨ锛岀‘瀹炴槸鍋忎綆鐨勩傞噰鍙栫殑锛屼粛鐒舵槸涔嬪墠鐨勪釜浜烘渶楂樿捶娆鹃搴︿负60涓囷紝澶涓や汉...
  • 涓鏂囧紕鎳鍐滄潙淇$敤绀捐捶娆鹃渶瑕佹潯浠朵互鍙婃祦绋
    绛旓細鍐滄埛璐锋鍔炵悊娴佺▼锛氬墠寰灞变笢鍐滄潙淇$敤绀剧綉鐐规彁浜よ捶娆剧敵璇封啋绛夊緟淇$敤绀捐瘎绾ф巿淇♀啋绛夊緟鏍稿畾鏀炬棰濆害鈫掔瓑寰呬俊鐢ㄧぞ绛惧彂璐锋璇佲啋璐锋鍙戞斁鍒板啘鎴锋墜涓傚啘姘戜綇鎴胯捶娆 鏍规嵁灞变笢鍐滄潙淇$敤绀剧殑瑙勫畾锛屽熸浜洪渶瑕佺殑鏉′欢鏄細 1銆佽捶娆剧敤閫旀槸鐢ㄤ簬寤鸿銆佽喘涔板眳浣忕敤鎴匡紱 2銆佺敓浜х粡钀ョ姸鍐点佹敹鍏ョ姸鍐电ǔ瀹氾紝鍏锋湁杈冨ソ鐨勭患鍚堣繕...
  • 涓鏂囧紕鎳:缁挎湰涓婃病鍐欐姷鎶兼槸涓嶆槸灏辫瘉鏄庢病鏈夋姷鎶?
    绛旓細濡傛灉涓婅堪鎯呭喌閮戒笉鏄紝寤鸿鐢ㄦ埛鍘昏溅绠℃墍鏌ヤ竴涓嬭溅杈嗙殑瀹為檯鐘舵佹槸鎬庢牱鐨勩 鐢变簬娌℃湁杩涜瑙f娂鐨勮溅杈嗘槸鏃犳硶杩涜涓婂競浜ゆ槗鎴栬呰繃鎴风殑锛屾墍浠ョ敤鎴蜂竴瀹氳娓呮杩欎竴鐐癸紝鏈濂芥槸鍦ㄨ繕娓呬互鍚庡皢甯︿笂缁撴竻璇佹槑绛夌浉鍏宠祫鏂欏幓杩涜瑙f娂銆 鑰屽湪杞﹁捶杩樻鏈熼棿娉ㄦ剰淇濇寔濂芥瘡鏈熺殑杩樻锛屼笉瑕佸嚭鐜伴炬湡浜嗭紝閫炬湡鎯呭喌涓ラ噸鐨勮瘽寰堝彲鑳借溅杈...
  • 2018骞磋殏铓佸熷憲鍒板簳涓?涓鏂囧紕鎳瀹!
    绛旓細2銆佺敤鎵嬫満缁欒嚜宸辫瀹氫竴涓繕娆炬彁绀轰俊鎭紝鍦ㄦ瘡涓湀杩樻鏃ョ殑2-3澶╁墠鎻愰啋鑷繁璁颁綇杩樻銆 3銆佸湪骞虫椂鐨勭敓娲讳腑锛岃鍏绘垚寰浣欓瀹濅腑瀛橀挶鐨勪範鎯紝浠ヤ究鍦ㄨ繕娆炬棩鑷繁鏈夎兘鍔涙嬁鍑虹浉搴旂殑閽辨潵銆 鎬荤殑鏉ヨ锛屽湪2018骞翠娇鐢ㄨ殏铓佸熷憲涓瀹氳灏忓績锛屽崈涓囦笉瑕佸嚭鐜伴炬湡澶氬ぉ鐨勬儏鍐碉紝鍚﹀垯灏变細缁欒嚜宸辩殑涓汉寰佷俊鐣欎笅姹$偣銆
  • 扩展阅读:证书制作联系方式 ... 证书制作生成器 ... 免费电子签名生成器 ... 免费一键生成证件照 ... 手机电子签名怎么弄 ... 输入姓名一键设计签名 ... 各种证书一键生成 ... 万能证书生成器 ... 免费签名设计一键生成器 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网