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注册一下
BouncyCastle签发证书
参考组员侯颖博客进行实践
使用BouncyCastle实现证书格式转换
- PEM<-->DER
二者均属于X509标准,PEM是BASE86标准,DER是ASN.1编码,证书的转换问题属于编码之间的转换。
代码已上传码云。 - PEM<-->PFX
PEM中只有公钥,PFX中有公钥和私钥。PEM是Base64编码,X509标准,PFX是二进制编码,PKCS#12标准。
码云链接
参考资料
- 廖雪峰官网BouncyCastle
- BouncyCastle配置
- Bouncy Castle FIPS Java API
- 大二下老师提供的JDK_API_1_6_CN.chm