署名同时利用了非对称性加密算法和择要算法,对一块数据署名时,会先对这块数据进行择要运算天生一个择要,然后对该择要利用发布者的私钥进行加密。 比如微信"大众平台开拓中最常见的调用api接口方法是将参数进行字典序排序,然后将参数名和参数值接成一个字符串,组合的字符串也就相称于我们这里说的择要,然后将择要用平台密钥加密。
吸收者(客户端)接管到数据后,先利用发布者的公钥进行解密得到原数据的择要,再对吸收到的数据打算择要,如果两个择要相同,则解释数据没有被修改。同时,由于发布者的私钥是不公开的,只要吸收者通过发布者的公钥能成功对数据进行解密,就解释该数据一定来源于该发布者。
那么怎么确定某公钥一定是属于某发布者的呢?这就须要证书了。证书由威信认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由威信认证机构利用它的私钥进行署名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由威信认证机构进行署名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更威信的认证机构进行署名,这样就形成了证书链。证书链最顶真个证书称为根证书,根证书就只有自署名了。总之,要对网络上传播的内容进行署名和认证,就一定会用到证书。关于证书遵照的标准,最盛行的是 X.509

二:证书管理
Keytool是一个Java数据证书的管理工具,这个工具一样平常在 JDK\jre\bin\security\目录下 。所有的数字证书因此一条一条(采取别名差异)的形式存入证书库的中,证书库中的每个证书包含该条证书的私钥,公钥和对应的数字证书的信息。
证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥
Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中
在keystore里,包含两种数据:
密钥实体(Key entity)— 密钥(secret key)又或者是私钥和配对公钥(采取非对称加密)
可信任的证书实体(trusted certificate entries)— 只包含公钥
1. 创建证书
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "d:\mykeystore.keystore" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass "123456" -storepass -validity 180
参数解释:
-genkeypair 表示要创建一个新的密钥
-dname 表示密钥的Distinguished Names, 表明了密钥的发行者身份
CN=commonName 注:天生证书时,CN要和做事器的域名相同,如果在本地测试,则利用localhost
OU=organizationUnit
O=organizationName
L=localityName
S=stateName
C=country
-keyalg 利用加密的算法,这里是RSA
-alias 和keystore关联的别名,这个alias常日不区分大小写
-keypass 私有密钥的密码,这里设置为 123456
-keystore 密钥保存在D:盘目录下的mykeystore文件中
-storepass 存取密码,这里设置为changeit,这个密码供应系统从mykeystore文件中将信息取出
-validity 该密钥的有效期为 180天 (默认为90天)
下面是各选项的缺省值。
-alias "mykey"-keyalg "DSA"-keysize 1024-validity 90-keystore 用户宿主目录中名为 .keystore 的文件-file 读时为标准输入,写时为标准输出
cacerts证书文件(The cacerts Certificates File)
该证书文件存在于java.home\jre\lib\security目录下,是Java系统的CA证书仓库
2.导出证书,由客户端安装keytool -export -alias tomcat -keystore d:\mykeystore -file d:\mycerts.cer -storepass 123456
3.客户端配置:为客户真个JVM导入密钥(将做事器下发的证书导入到JVM中)keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts " -file d:\mycerts.cer -storepass 123456
天生的证书可以交付客户端用户利用,用以进行SSL通讯,或者伴随电子署名的jar包进行发布者的身份认证。
常涌现的非常:“未找到可信任的证书”--紧张缘故原由为在客户端未将做事器下发的证书导入到JVM中,可以用
keytool -list -alias tomcat -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass 123456
来查看证书是否真的导入到JVM中。
keytool天生根证书时涌现如下缺点:
keytool缺点:java.io.IOException:keystore was tampered with,or password was incorrect
缘故原由是在你的home目录下是否还有.keystore存在。如果存在那么把他删除掉,然后再实行或者删除"%JAVA_HOME%/jre/lib/security/cacerts 再实行
数字证书中keytool命令利用解释
-alias 证书别名
-keystore 指定密钥库的名称(cacerts是jre中默认的证书库名字,也可以利用其它名字 )
-storepass 指定密钥库的密码
-keypass 指定别名条款标密码
-list 显示密钥库中的证书信息
-v 显示密钥库中的证书详细信息
-export 将别名指定的证书导出到文件
-file 指定导出到文件的文件名
-delete 删除密钥库中某条款
-import 将已署名数字证书导入密钥库
-keypasswd 修正密钥库中指定条款口令
-dname 指定证书拥有者信息
-keyalg 指定密钥的算法
-validity 指定创建的证书有效期多少天
-keysize 指定密钥长度
示例解释:
浏览证书库里面的证书信息,可以利用如下命令:
keytool -list -v -alias tomcat -keystore cacerts -storepass 666666
keytool -list -rfc -keystore e:/yushan.keystore -storepass 123456
keytool -list -v -keystore privateKey.store
缺省情形下,-list 命令打印证书的 MD5 指纹。而如果指定了 -v 选项,将以可读格式打印证书,如果指定了 -rfc 选项,将以可打印的编码格式输出证书
要删除证书库里面的某个证书,可以利用如下命令:
keytool -delete -alias tomcat -keystore cacerts -storepass 666666
要导出证书库里面的某个证书,可以利用如下命令:
keytool -export -keystore cacerts -storepass 666666 -alias tomcat -file F:\server.cer
keytool -export -alias tomcat -keystore e:/server.jks -file e:/server.crt -rfc -storepass 123456
备注: keystore.jks 也可以为 .keystore格式 ; server.crt也可以为 .cer格式"-rfc" 表示以base64输出文件,否则以二进制输出。
要修正某个证书的密码(把稳:有些数字认证没有私有密码,只有公匙,这种情形此命令无效)
这个是交互式的,在输入命令后,会哀求你输入密码
keytool -keypasswd -alias tomcat -keystore cacerts
这个不是交互式的,输入命令后直接变动
Keytool -keypasswd -alias tomcat -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts
修正别名:
keytool -changealias -keystore mykeystore.keystore -alias 当前别名 -destalias 新别名
主流数字证书都有哪些格式
一样平常来说,主流的Web做事软件,常日都基于OpenSSL和Java两种根本密码库。
Tomcat、Weblogic、JBoss等Web做事软件,一样平常利用Java供应的密码库。通过Keytool工具,天生Java Keystore(JKS)格式的证书文件。Apache、Nginx等Web做事软件,一样平常利用OpenSSL工具供应的密码库,天生PEM、KEY、CRT等格式的证书文件。IBM的Web做事产品,如Websphere、IBM Http Server(IHS)等,一样平常利用IBM产品自带的iKeyman工具,天生KDB格式的证书文件。微软Windows Server中的Internet Information Services(IIS)做事,利用Windows自带的证书库天生PFX格式的证书文件。如何判断证书文件是文本格式还是二进制格式您可以利用以下方法大略区分带有后缀扩展名的证书文件:
.DER或.CER文件: 这样的证书文件是二进制格式,只含有证书信息,不包含私钥。.CRT文件: 这样的证书文件可以是二进制格式,也可以是文本格式,一样平常均为文本格式,功能与 .DER及.CER证书文件相同。.PEM文件: 这样的证书文件一样平常是文本格式,可以存放证书或私钥,或者两者都包含。 .PEM 文件如果只包含私钥,一样平常用.KEY文件代替。.PFX或.P12文件: 这样的证书文件是二进制格式,同时包含证书和私钥,且一样平常有密码保护。您也可以利用记事本直接打开证书文件。如果显示的是规则的数字字母,例如:
—–BEGIN CERTIFICATE—–MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh......—–END CERTIFICATE—–
那么,该证书文件是文本格式的。
如果存在——BEGIN CERTIFICATE——,则解释这是一个证书文件。如果存在—–BEGIN RSA PRIVATE KEY—–,则解释这是一个私钥文件。
证书格式之间的转换如下图:
Note: 阿里如斯盾证书做事统一利用 PEM 格式的数字证书文件。
将JKS格式证书转换成PFX格式您可以利用JDK中自带的Keytool工具,将JKS格式证书文件转换成PFX格式。例如,您可以实行以下命令将server.jks证书文件转换成server.pfx证书文件:keytool -importkeystore -srckeystore D:\server.jks -destkeystore D:\server.pfx -srcstoretype JKS -deststoretype PKCS12将PFX格式证书转换为JKS格式您可以利用JDK中自带的Keytool工具,将PFX格式证书文件转换成JKS格式。例如,您可以实行以下命令将server.pfx证书文件转换成server.jks证书文件:keytool -importkeystore -srckeystore D:\server.pfx -destkeystore D:\server.jks -srcstoretype PKCS12 -deststoretype JKS将PEM/KEY/CRT格式证书转换为PFX格式您可以利用 OpenSSL工具,将KEY格式密钥文件和CRT格式公钥文件转换成PFX格式证书文件。例如,将您的KEY格式密钥文件(server.key)和CRT格式公钥文件(server.crt)拷贝至OpenSSL工具安装目录,利用OpenSSL工具实行以下命令将证书转换成server.pfx证书文件:openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt将PFX转换为PEM/KEY/CRT可以利用 OpenSSL工具,将PFX格式证书文件转化为KEY格式密钥文件和CRT格式公钥文件。例如,将您的PFX格式证书文件拷贝至OpenSSL安装目录,利用OpenSSL工具实行以下命令将证书转换成server.pem证书文件,KEY格式密钥文件(server.key)和CRT格式公钥文件(server.crt):openssl pkcs12 -in server.pfx -nodes -out server.pemopenssl rsa -in server.pem -out server.keyopenssl x509 -in server.pem -out server.crt Note: 此转换步骤是专用于通过Keytool工具天生私钥和CSR申请证书文件的,并且通过此方法您可以在获取到PEM格式证书公钥的情形下分离私钥。
(Java、.Net、Php)措辞须要的证书格式并不一致,比如说Java我们采取jks,.Net采取pfx和cer,Php则采取pem和cer;
紧张分成两类,其一为密钥库文件格式、其二为证书文件格式;
密钥库文件格式
秘钥库观点:所有的公钥和私钥同证书都会被存储在密钥库中 由于证书须要被署名, 署名必须利用非对称加密算法+HASH算法 以是一样平常是MD5WithRSA或者SHA1WithRSA
格式扩展名描述特点
JKS
.jks/.ks
【Java Keystore】密钥库的Java实现版本,provider为SUN
密钥库和私钥用不同的密码进行保护
JCEKS
.jce
【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE
相对付JKS安全级别更高,保护Keystore私钥时采取TripleDES
PKCS12
.p12/.pfx
【PKCS #12】个人信息交流语法标准
1、包含私钥、公钥及其证书2、密钥库和私钥用相同密码进行保护
BKS
.bks
【Bouncycastle Keystore】密钥库的BC实现版本,provider为BC
基于JCE实现
UBER
.ubr
【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC
证书文件格式【Certificate】
格式扩展名描述特点DER.cer/.crt/.rsa【ASN .1 DER】用于存放证书不包含私钥,二进制格式PKCS7.p7b/.p7r【PKCS #7】加密信息语法标准1、p7b以树状展示证书链,不含私钥2、p7r为CA对证书要求署名的回答,只能用于导入CMS.p7c/.p7m/.p7s【Cryptographic Message Syntax】
1、p7c只保存证书2、p7m:signature with enveloped data3、p7s:韶光戳署名文件
PEM.pem【Printable Encoded Message】1、该编码格式在RFC1421中定义,实在PEM是【Privacy-Enhanced Mail】的简写,但他也同样广泛利用于密钥管理2、ASCII文件3、一样平常基于base 64编码PKCS10.p10/.csr【PKCS #10】公钥加密标准【Certificate Signing Request】1、证书署名要求文件2、ASCII文件3、CA署名后以p7r文件回答SPC.pvk/.spc【Software Publishing Certificate】微软公司特有的双证书文件格式,常常用于代码署名,个中1、pvk用于保存私钥2、spc用于保存公钥
证书格式转换工具先容
目前两大开拓平台Java和.Net都供应了干系的证书管理工具,
Java是keytool,参考http://java.sun.com/javase/6/docs/technotes/tools/windows/keytool.html;
.Net为makecert,参考http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp;
但是两者遵照的标准并不是完备兼容,有很多都是基于自己的实现,以是很多的文件格式并不通用,在实际开拓利用过程中我们可能须要进行格式转换,
在转换过程中,常见格式的转换可以利用keytool或者是windows证书管理导入导出工具;
其余一个很有用的工具便是OpenSSL,首页地址为http://www.openssl.org/,各种格式间的转换示例这里就不供应了
这里要提一些把稳事变和小工具:
1、Java平台keytool对X.509证书的支持并不一致,6.0版本之前天生的证书都是v1版本的,这在很多运用处所可能会导致一些潜在的问题,但是他还是能够管理v3版本的证书的,从6.0开始keytool支持v3版本的证诗人成;2、Eclipse插件SecureX推举,这是一个国人贡献的证诗人成、管理工具,效果还是不错的,而且可以下载源代码查看,对学习Security方面的编程很有帮助,可以从http://securex.sourceforge.net/updatesite更新,目前版本为2.0,不过彷佛现在作者也没有更新了;3、KeyTool IUI工具推举,这是一个老外编写的Keytool GUI工具,功能大致和SecureX类似,他可以以application或者Java Web Start启动查看,但作者并没有供应源代码下载,首页为http://yellowcat1.free.fr/keytool_iui.html;