证书主要包括颁发者和被办法者的信息,以及被颁发者的公钥,和CA机构对这些信息的认证,
主要内容:node
**版本** 识别用于该证书的 X.509 标准的版本,这能够影响证书中所能指定的信息。迄今为止,已定义的版本有三个。 **序列号** 发放证书的实体有责任为证书指定序列号,以使其区别于该实体发放的其它证书。此信息用途不少。例如,若是某一证书被撤消,其序列号将放到证书撤消清单 (CRL) 中。 **签名算法标识符** 用于识别 CA 签写证书时所用的算法。 **签发人姓名** 签写证书的实体的 X.500 名称。它一般为一个 CA。 使用该证书意味着信任签写该证书的实体(注意:有些状况下(例如根或顶层 CA 证书),签发人会签写本身的证书)。 **有效期** 每一个证书均只能在一个有限的时间段内有效。该有效期以起始日期和时间及终止日期和时间表示,能够短至几秒或长至一世纪。所选有效期取决于许多因素,例如用于签写证书的私钥的使用频率及愿为证书支付的金钱等。它是在没有危及相关私钥的条件下,实体能够依赖公钥值的预计时间。 **主体名** 证书能够识别其公钥的实体名。此名称使用 X.500 标准,所以在Internet中应是惟一的。它是实体的特征名 (DN),例如, CN=Java Duke,OU=Java Software Division,O=Sun Microsystems Inc,C=US (这些指主体的通用名、组织单位、组织和国家)。 **主体公钥信息** 这是被命名实体的公钥,同时包括指定该密钥所属公钥密码系统的算法标识符及全部相关的密钥参数。
PEM DER 只是编码方式,注意并不指定是证书的编码方式,也能够是密钥的编码方式git
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.github
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.web
总结起来:crt cer约等于x509证书,key保存公钥或私钥,csr是证书签名请求,pfx包含证书和私钥
当我发现还有PKCS系列时,我很凌乱,
PKCS系列是 Public-Key Cryptography Standards ,是RSA制定的一系列的标准,注意前面写的什么文件后缀啥的,都不算是标准,只有X509和PKCS能够称为标准,
PKCS中常用的就是:PKCS1 PKCS8 PKCS12算法
总结:PKCS1,8,12均可以在某些状况下看成文件格式,PKCS1描述基础的密钥格式,PKCS8也描述密钥,但格式和1不一样,PKCS12等价于PFX文件,包含证书和私钥
# 生成PKCS#1的公私钥 openssl genrsa -out pkcs1_private.pem 1024 openssl rsa -in pkcs1_private.pem -RSAPublicKey_out -out pkcs1_public.pem 查看私钥 openssl rsa -in rsa_private_key.pem -text -noout 查看公钥 openssl rsa -pubin -in rsa_public_key.pem -text # 由PKCS#1的私钥,生成PKCS#8的公私钥 openssl pkcs8 -topk8 -inform PEM -in pkcs1_private.pem -outform PEM -nocrypt -out from_pkcs1_private_to_pkcs8_private.pem openssl rsa -in pkcs1_private.pem -pubout -out from_pkcs1_private_to_pkcs8_public.pem # 由PKCS#8的私钥,生成PKCS#1的公私钥 openssl rsa -in from_pkcs1_private_to_pkcs8_private.pem -out from_pkcs8_private_to_pkcs1_private.pem openssl rsa -in from_pkcs1_private_to_pkcs8_private.pem -RSAPublicKey_out -out from_pkcs8_private_to_pkcs1_public.pem # 由PKCS1公钥生成PKCS#8公钥: openssl rsa -RSAPublicKey_in -in pkcs1_public.pem -pubout -out from_pkcs1_public_to_pkcs8_public.pem # 由PKCS8公钥生成PKCS#1公钥: openssl rsa -pubin -in from_pkcs1_private_to_pkcs8_public.pem -RSAPublicKey_out -out from_pkcs8_public_to_pkcs1_public.pem 产生证书请求 注意PKCS1 8均可以 openssl req -new -key private_key.pem -out rsaCerReq.csr 产生证书 注意PKCS1 8均可以 openssl x509 -req -days 3650 -in rsaCerReq.csr -signkey private_key.pem -out rsaCert.crt 从证书得到公钥: openssl x509 -in rsaCert.crt -noout -pubkey > public_key.pem 生成PKCS12 openssl pkcs12 -export -inkey serverprikey.pem -in server.pem -password pass:"123456" -out server_nocret.pfx 从PKCS12得到证书和私钥 openssl pkcs12 -in server_nocret.pfx -nocerts -nodes -out alicekey.pem openssl pkcs12 -in server_nocret.pfx -nokeys -out cert.pem 查看pkcs12内容 -nodes:由于私钥在在输出前会输出加密结果,因此须要nodes来保证不用打密码和不加密 openssl pkcs12 -in server_nocret.pfx -nocerts -nodes -out alicekey.pem
为何难以破解:
在已知 公钥 N E 的状况下,想要知道 私钥的额D 就须要知道m,而 m=(p-1)(Q-1),想要知道P Q
就只能对 N 进行分解,而大整数的因式分解是难以破解的,因此保证了安全安全
以前我一直奇怪为何私钥能够转换出公钥,觉得是RSA算法的原理所致使,但看起来原理并不知足私钥算出公钥的操做,因此我以为问题出在PKCS内容上:服务器
PKCS1 的公钥结构: RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e } PKCS1 的私钥结构: RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL } PKCS1 公钥: PublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, PublicKey BIT STRING } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } PKCS8私钥 PrivateKeyInfo ::= SEQUENCE { version Version, algorithm AlgorithmIdentifier, PrivateKey BIT STRING } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL }
能够看出PKCS1 的私钥包含了密钥产生的全部元素,因此能算出公钥就不奇怪了,至于PKCS8 看起来不包含,但为何也能够,我想应该只是结构不一样,内容应该都是有的函数
https://blog.csdn.net/xy01090...
注意这个文章的漫画有一个错误的地方,证书并非CA私钥对公司公钥加密的结果
而应该是以下面这个文章的说法,证书=s_KeyPub + s_Info + ca_Info + enc_s_Hash
s_KeyPub:公司公钥
s_Info:公司信息
ca_Info:ca机构
enc_s_Hash:ca对公司的认证,=ca_pri(hash(s_KeyPub + s_Info + ca_Info))
证书在通信中如何加签和验签,ui
https://zhuanlan.zhihu.com/p/...
阐述PKCS1 PKCS8的区别,以及PKCS的结构编码
https://www.shangyang.me/2017...
描述PKCS
https://qsiofttt.iteye.com/bl...
密钥之间转换:
https://xuanxuanblingbling.gi...
RSA:
https://www.zhihu.com/questio...