• 证书及证书管理


    证书及证书管理
    一、什么是证书?为什么要使用证书?
    对数据进行签名(加密)是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。
    签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。 比如微信公众平台开发中最常见的调用api接口方法是将参数进行字典序排序,然后将参数名和参数值接成一个字符串,组合的字符串也就相当于我们这里说的摘要,然后将摘要用平台密钥加密。
    接收者(客户端)接受到数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者。
    那么怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509。
    二、证书管理
    Keytool是一个Java数据证书的管理工具,这个工具一般在 JDKjreinsecurity目录下 。所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的每个证书包含该条证书的私钥,公钥和对应的数字证书的信息。
    证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。在keystore里,包含两种数据:
    (1)密钥实体(Key entity)— 密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)。
    (2)可信任的证书实体(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.homejrelibsecurity目录下,是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 再执行。
    4、Keytool命令小结
    数字证书中keytool命令使用说明
    -alias 证书别名
    -keystore 指定密钥库的名称(cacert是jre中默认的证书库名字,也可以使用其它名字)
    -storepass 指定密钥库的密码
    -keypass 指定别名条目的密码
    -list 显示密钥库中的证书信息
    -v 显示密钥库中的证书详细信息
    -export 将别名指定的证书导出到文件
    -file 指定导出到文件的文件名
    -delete   删除密钥库中某条目
    -import 将已签名数字证书导入密钥库
    -keypasswd 修改密钥库中指定条目口令
    -dname 指定证书拥有者信息
    -keyalg 指定密钥的算法
    -validity 指定创建的证书有效期多少天
    -keysize 指定密钥长度

    示例说明:
    (1)浏览证书库里面的证书信息,可以使用如下命令:
    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 选项,将以可打印的编码格式输出证书

    (2)要删除证书库里面的某个证书,可以使用如下命令:
    keytool -delete -alias tomcat -keystore cacerts -storepass 666666

    (3)要导出证书库里面的某个证书,可以使用如下命令:
    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输出文件,否则以二进制输出。

    (4)要修改某个证书的密码(注意:有些数字认证没有私有密码,只有公匙,这种情况此命令无效)
    这个是交互式的,在输入命令后,会要求你输入密码
    keytool -keypasswd -alias tomcat -keystore cacerts
    这个不是交互式的,输入命令后直接更改
    Keytool -keypasswd -alias tomcat -keypass 888888 -new 123456 -storepass 666666 -keystore cacerts

    (5)修改别名:
    keytool -changealias -keystore mykeystore.keystore -alias 当前别名 -destalias 新别名
    三、证书文件与密钥库文件
    1、证书文件
    主流数字证书都有哪些格式?
    一般来说,主流的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—–,则说明这是一个私钥文件。
    证书格式之间的转换
    如下图:

     将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.pem
    openssl rsa -in server.pem -out server.key
    openssl x509 -in server.pem -out server.crt
    注意: 此转换步骤是专用于通过Keytool工具生成私钥和CSR申请证书文件的,并且通过此方法可以在获取到PEM格式证书公钥的情况下分离私钥。
    证书格式转换工具介绍
    目前两大开发平台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;
    2、密钥库文件
    语言(Java、.Net、Php)需要的证书格式并不一致,比如说Java我们采用jks,.Net采用pfx和cer,Php则采用pem和cer;
    主要分成两类,其一为密钥库文件格式、其二为证书文件格式;
    密钥库文件格式
    秘钥库概念:所有的公钥和私钥同证书都会被存储在密钥库中 因为证书需要被签名, 签名必须使用非对称加密算法+HASH算法 所以一般是MD5WithRSA或者SHA1WithRSA。

    证书文件格式

    参考博客
    [1] 证书及证书管理(keytool工具实例)
    https://www.cnblogs.com/benwu/articles/4891758.html

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/shujk/p/13648931.html
Copyright © 2020-2023  润新知