Scroll to top

2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week 2

本周计划

  • 收集相关资料,学习BouncyCastle的使用方法
  • 使用BouncyCastle编程实现证书格式的转换

java标准库与数字证书

了解java.security.cert.Certificate类

  • 简介
    • 管理各种身份证书的抽象类。身份证书是一个主体与由另一个主体所担保的公钥之间的绑定关系。
    • 是具有不同格式但是很常用的证书的抽象。
  • 方法
    • getEncoded() 返回此证书的编码形式。
    • getPublicKey() 从此证书中获得公钥。
    • getType() 返回此证书的类型。
    • hashCode() 根据此证书的编码形式返回该证书的哈希码值。
    • toString() 返回此证书的字符串表示形式。

了解java.security.KeyStore类

  • 简介
    • KeyStore类用于表示密钥和证书的存储设施
    • KeyStore 中的每一条目都用 “alias” 字符串标识。对于私钥及其关联的证书链,这些字符串用于区分实体验证自身可以采用的不同方式。
    • 别名是否区分大小写与实现有关。为了避免出现问题,建议不要在 KeyStore 中使用只有大小写区别的别名。
  • 常用方法
    • getCertificate(String alias) 返回与给定别名关联的证书。
    • getCertificateChain(String alias) 返回与给定别名关联的证书链。
    • getDefaultType() 返回 Java 安全属性文件中指定的默认 keystore 类型。
    • getInstance(String/provider type) 返回指定类型的 keystore 对象。
    • getKey(String alias, char[] password) 返回与给定别名关联的密钥,并用给定密码来恢复它。
    • getProvider() 返回此 keystore 的提供者。
    • getType() 返回此 keystore 的类型。
    • load(InputStream stream, char[] password) 从给定输入流中加载此 KeyStore。
    • store(OutputStream stream, char[] password) 将此 keystore 存储到给定输出流,并用给定密码保护其完整性。

了解java.security.KeyFactory类

  • 简介
    • 密钥工厂用于将密钥(Key 类型的不透明加密密钥)转换成密钥规范(底层密钥材料的透明表示),反之亦然。
    • 密钥工厂是双向的。
  • 常用方法
    • getInstance(String algorithm) 返回转换指定算法的 public/private 关键字的 KeyFactory 对象。

标准库实现数字证书加解密和签名

  • 创建一个key store
    keytool -storepass 123456 -genkeypair -keyalg RSA -keysize 1024 -sigalg SHA1withRSA -validity 3650 -alias mycert -keystore my.keystore -dname "CN=www.sample.com, OU=sample, O=sample, L=BJ, ST=BJ, C=CN"
    • keyalg:指定RSA加密算法;
    • sigalg:指定SHA1withRSA签名算法;
    • validity:指定证书有效期3650天;
    • alias:指定证书在程序中引用的名称;
    • dname:最重要的CN=www.sample.com指定了Common Name,如果证书用在HTTPS中,这个名称必须与域名完全一致。
      执行上述命令,JDK会在当前目录创建一个my.keystore文件,并存储创建成功的一个私钥和一个证书,它的别名是mycert。
  • 使用mycert实现加解密和签名

BouncyCastle与数字证书

了解什么BouncyCastle

BouncyCastle就是一个提供了很多哈希算法和加密算法的免费的、开源的第三方库。它提供了很多Java标准库没有提供的哈希算法和加密算法,避免的自己动手写,难度大、太多漏洞的麻烦。

PEMReader

  • 简介:用于读取X509证书、PKCS8编码密钥和PKCS7对象的OpenSSL PEM编码流的类。
  • 常用方法
    • readCertificate(java.lang.String endMarker) Reads in a X509Certificate
    • readCertificateRequest(java.lang.String endMarker)Reads in a PKCS10 certification request
    • readKeyPair(java.lang.String type, java.lang.String endMarker) Read a Key Pair
    • readPKCS7(java.lang.String endMarker) Reads in a PKCS7 object

对于PKCS7对象,读取器将返回一个CMS ContentInfo对象。密钥和证书将使用适当的java.security类型返回

如何使用BouncyCastle这个第三方提供的算法

Java标准库的java.security包提供了一种标准机制,允许第三方提供商无缝接入。我们可以通过修改java.security包,达到目的

  • 下载、配置BouncyCastle

    • 查看主机JDK版本

    • BouncyCastle 官网提供有不同JDK版本的JAR包下载

    • 把jar文件复制到 $JAVA_HOME$\jre\lib\ext 目录下面

    • 修改\jre\lib\security\java.security配置文件,然后再重复操作\jdk\lib\security\java.security

    • 用记事本尝试打开,显示找不到文件。

      找不到文件?大概是权限问题?拖到桌面,修改,再移动回去试试,ok,fine

  • 测试运行

    • 我们要使用BouncyCastle提供的算法,需要先把BouncyCastle注册一下Security.addProvider(new BouncyCastleProvider());
    • 测试运行一下(记得导入jar包哦)

BouncyCastle签发证书

参考组员侯颖博客进行实践

使用BouncyCastle实现证书格式转换

  • PEM<-->DER
    二者均属于X509标准,PEM是BASE86标准,DER是ASN.1编码,证书的转换问题属于编码之间的转换。

    代码已上传码云。
  • PEM<-->PFX
    PEM中只有公钥,PFX中有公钥和私钥。PEM是Base64编码,X509标准,PFX是二进制编码,PKCS#12标准。

码云链接

参考资料

END

posted @ 2020-04-24 15:20  September_starlet  阅读(226)  评论(0编辑  收藏  举报
动态线条
动态线条end