zoukankan      html  css  js  c++  java
  • java-信息安全(十三)-数字证书-格式、编码、keytool、keystore

    一、概述

      Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。 

      在keystore里,包含两种数据: 

      1. 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密) 

      2. 可信任的证书实体(trusted certificate entries)——只包含公钥

      ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写

    1.1、证书格式

      证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSRCRTCRL 、OCSP、SCEP等。

    1.1.1、证书编码格式

      X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

    目前有以下两种编码格式.

    1、PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.

      查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout

      Apache和NGINX服务器偏向于使用这种编码格式.

      PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:

      1. 内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。

      2. 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。

      3. 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。

    使用PEM格式存储的证书:
    —–BEGIN CERTIFICATE—–
    MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
    ………
    1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
    —–END CERTIFICATE—–
    
    使用PEM格式存储的私钥:
    —–BEGIN RSA PRIVATE KEY—–
    MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
    ………
    1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
    —–END RSA PRIVATE KEY—–
    
    使用PEM格式存储的证书请求文件:
    —–BEGIN CERTIFICATE REQUEST—–
    MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
    ………
    1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
    —–END CERTIFICATE REQUEST—–
    View Code

    2、DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。

         DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.

      查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout

      Java和Windows服务器偏向于使用这种编码格式.

    1.1.3、证书编码的转换

      PEM转为DER openssl x509 -in cert.crt -outform der -out cert.der

      DER转为PEM openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

      (提示:要转换KEY文件也类似,只不过把x509换成rsa,要转CSR的话,把x509换成req...)

    1.2、扩展名

      有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.

      CRT - 是certificate,是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码

      CER - 是certificate,证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.证书中没有私钥,DER 编码二进制格式的证书文件

      KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.

        查看KEY的办法:openssl rsa -in mykey.key -text -noout
        如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

      CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.

        查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)

      PFX/P12 - predecessor of PKCS#12,包含公钥和私钥的二进制格式证书

        对nginx服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中。

        PFX通常会有一个"提取密码",读取需要提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码?

          openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes

        这个时候会提示你输入提取代码. for-iis.pem就是可读的文本.

        生成pfx的命令类似这样:openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx

        其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库.

      p7b - 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

      JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.

    小结

      X.509#DER 二进制格式证书,常用后缀.cer .crt

      X.509#PEM 文本格式证书,常用后缀.pem

      有的证书内容是只包含公钥(服务器的公钥),如.crt、.cer、.pem

      有的证书既包含公钥又包含私钥(服务器的私钥),如.pfx、.p12

    示例

    1、从pfx导出crt和key:

      操作命令:
      openssl pkcs12 -in example.cn.ssl.pfx -nocerts -nodes -out example.key
      openssl pkcs12 -in example.cn.ssl.pfx -clcerts -nokeys -out example.crt

    2、将crt和key合并出pfx:

      操作命令:

      openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx

    1.3、常用命令

    基础语法

      keytool -command_name

    命令说明

    -genkey 在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书(在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:Documents and SettingsUserName文件名为“.keystore”) 
    -alias 产生别名
    -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)
    -keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))
    -validity 指定创建的证书有效期多少天
    -keysize 指定密钥长度
    -storepass 指定密钥库的密码(获取keystore信息所需的密码)
    -keypass 指定别名条目的密码(私钥的密码)
    -dname 指定证书拥有者信息 例如: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”
    -list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码
    -v 显示密钥库中的证书详细信息
    -export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码
    -file 参数指定导出到文件的文件名
    -delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码
    -printcert 查看导出的证书信息 keytool -printcert -file yushan.crt
    -keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage
    -storepasswd 修改keystore口令 keytool -storepasswd -keystore e:yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)
    -import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

    1.2、示例

    1、创建keystore文件 

    keytool -genkey -alias test -keystore test.keystore -keyalg RSA

    2、检查一个keystore:

    keytool -list -v -keystore test.keystore

    3、导出cer文件

    keytool -export -alias test -keystore test.keystore -rfc -file test.cer

    将把证书库 .keystore 中的别名为 test 的证书导出到 test.cer 证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。

    查看保存在文件中的证书

    keytool -printcert -file test.cer

    信息安全基本概念

    前置

      java-信息安全(十二)-数字签名【Java证书体系实现】

    过程

      通过工具JarSigner可以完成代码签名。 
      这里我们对tools.jar做代码签名,命令如下:

      进入D盘下    

    jarsigner -storetype jks -keystore zlex.keystore -verbose tools.jar www.zlex.org  

      输出  

    输入密钥库的口令短语:  
     正在更新: META-INF/WWW_ZLEX.SF  
     正在更新: META-INF/WWW_ZLEX.RSA  
      正在签名: org/zlex/security/Security.class  
      正在签名: org/zlex/tool/Main$1.class  
      正在签名: org/zlex/tool/Main$2.class  
      正在签名: org/zlex/tool/Main.class  
      
    警告:  
    签名者证书将在六个月内过期。

    验证tools.jar,命令如下:

    jarsigner -verify -verbose -certs tools.jar  

    输出

             402 Sat Jun 20 16:25:14 CST 2009 META-INF/MANIFEST.MF  
             532 Sat Jun 20 16:25:14 CST 2009 META-INF/WWW_ZLEX.SF  
             889 Sat Jun 20 16:25:14 CST 2009 META-INF/WWW_ZLEX.RSA  
    sm       590 Wed Dec 10 13:03:42 CST 2008 org/zlex/security/Security.class  
      
          X.509, CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN  
          [证书将在 09-9-18 下午3:27 到期]  
      
    sm       705 Tue Dec 16 18:00:56 CST 2008 org/zlex/tool/Main$1.class  
      
          X.509, CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN  
          [证书将在 09-9-18 下午3:27 到期]  
      
    sm       779 Tue Dec 16 18:00:56 CST 2008 org/zlex/tool/Main$2.class  
      
          X.509, CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN  
          [证书将在 09-9-18 下午3:27 到期]  
      
    sm     12672 Tue Dec 16 18:00:56 CST 2008 org/zlex/tool/Main.class  
      
          X.509, CN=www.zlex.org, OU=zlex, O=zlex, L=BJ, ST=BJ, C=CN  
          [证书将在 09-9-18 下午3:27 到期]  
      
      
      s = 已验证签名  
      m = 在清单中列出条目  
      k = 在密钥库中至少找到了一个证书  
      i = 在身份作用域内至少找到了一个证书  
      
    jar 已验证。  

      代码签名认证的用途主要是对发布的软件做验证,支持 Sun Java .jar (Java Applet) 文件(J2SE)和 J2ME MIDlet Suite 文件。 

  • 相关阅读:
    C# 消息队列 RabbitMQ
    C# webapi简单学习
    Navicat Premium 12注册机使用教程
    .net WCF简单练习
    MSDN 我告诉你(资源库)
    Dapper查询返回Datatable
    day55 无连接,无状态,会话跟踪、cookie、django中操作cookie、session、django中操作session
    day54 锁和事务、ajax、中间件
    day53 url别名反向解析、ORM多表操作、聚合查询、分组查询、F查询、Q查询
    day52
  • 原文地址:https://www.cnblogs.com/bjlhx/p/6565340.html
Copyright © 2011-2022 走看看