JAVA加密解密之数字证书

x33g5p2x  于2021-12-25 转载在 其他  
字(27.0k)|赞(0)|评价(0)|浏览(453)

系统之间在进行交互的时候,我们经常会用到数字证书,数字证书可以帮我们验证身份等,下面我们就来看一下在java中如何使用数字证书。
我们先使用keytool工具生成密钥库并导出公钥证书。
第一步:生成keyStroe文件
执行如下命令:
keytool -genkey -validity 36000 -alias www.jianggujin.com -keyalg RSA -keystore test.keystore

该命令相关参数如下:

输入完后,我们需要按照提示完成后续信息的输入,这里面我们使用的密码为:123456

第二步:导出公钥证书
生成完密钥库后,我们就可以导出公钥文件了,执行如下命令:
keytool -export -keystore test.keystore -alias www.jianggujin.com -file test.cer -rfc

该命令相关参数如下:

完整操作过程如下:

经过这两步后,我们就有了密钥库和证书文件,和之前的加密解密工具类一样,我们再来编写一个用于操作数字证书的工具类:

  1. package com.jianggujin.codec;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.security.Key;
  5. import java.security.KeyStore;
  6. import java.security.KeyStoreException;
  7. import java.security.NoSuchAlgorithmException;
  8. import java.security.PrivateKey;
  9. import java.security.PublicKey;
  10. import java.security.UnrecoverableKeyException;
  11. import java.security.cert.Certificate;
  12. import java.security.cert.CertificateExpiredException;
  13. import java.security.cert.CertificateFactory;
  14. import java.security.cert.CertificateNotYetValidException;
  15. import java.security.cert.X509Certificate;
  16. import java.util.ArrayList;
  17. import java.util.Date;
  18. import java.util.Enumeration;
  19. import java.util.List;
  20. import javax.crypto.Cipher;
  21. import com.jianggujin.codec.util.JCipherInputStream;
  22. import com.jianggujin.codec.util.JCipherOutputStream;
  23. import com.jianggujin.codec.util.JCodecException;
  24. import com.jianggujin.codec.util.JCodecUtils;
  25. /** * 数字证书 * * @author jianggujin * */
  26. public class JCertificate {
  27. public final static String X509 = "X.509";
  28. /** * 密钥库枚举 * * @author jianggujin * */
  29. public static enum JKeyStore {
  30. JCEKS, JKS, DKS, PKCS11, PKCS12;
  31. public String getName() {
  32. return this.name();
  33. }
  34. }
  35. /** * 获得{@link KeyStore} * * @param in * @param password * @param keyStore * @return */
  36. public static KeyStore getKeyStore(InputStream in, char[] password, JKeyStore keyStore) {
  37. return getKeyStore(in, password, keyStore.getName());
  38. }
  39. /** * 获得{@link KeyStore} * * @param in * @param password * @param keyStore * @return * @throws Exception */
  40. public static KeyStore getKeyStore(InputStream in, char[] password, String keyStore) {
  41. try {
  42. KeyStore ks = KeyStore.getInstance(keyStore);
  43. ks.load(in, password);
  44. return ks;
  45. } catch (Exception e) {
  46. throw new JCodecException(e);
  47. }
  48. }
  49. /** * 列出别名 * * @param keyStore * @return */
  50. public static List<String> listAlias(KeyStore keyStore) {
  51. try {
  52. Enumeration<String> aliasEnum = keyStore.aliases();
  53. List<String> aliases = new ArrayList<String>();
  54. while (aliasEnum.hasMoreElements()) {
  55. aliases.add(aliasEnum.nextElement());
  56. }
  57. return aliases;
  58. } catch (KeyStoreException e) {
  59. throw new JCodecException(e);
  60. }
  61. }
  62. /** * 获得私钥 * * @param keyStore * @param alias * @param password * @return */
  63. public static PrivateKey getPrivateKey(KeyStore keyStore, String alias, char[] password) {
  64. try {
  65. PrivateKey key = (PrivateKey) keyStore.getKey(alias, password);
  66. return key;
  67. } catch (Exception e) {
  68. throw new JCodecException(e);
  69. }
  70. }
  71. /** * 获得私钥 * * @param in * @param alias * @param password * @param keyStore * @return */
  72. public static PrivateKey getPrivateKey(InputStream in, String alias, char[] password, JKeyStore keyStore) {
  73. return getPrivateKey(in, alias, password, keyStore.getName());
  74. }
  75. /** * 获得私钥 * * @param in * @param alias * @param password * @param keyStore * @return * @throws Exception */
  76. public static PrivateKey getPrivateKey(InputStream in, String alias, char[] password, String keyStore) {
  77. try {
  78. KeyStore ks = getKeyStore(in, password, keyStore);
  79. PrivateKey key = (PrivateKey) ks.getKey(alias, password);
  80. return key;
  81. } catch (Exception e) {
  82. throw new JCodecException(e);
  83. }
  84. }
  85. /** * 获得{@link Certificate} * * @param in * @return */
  86. public static Certificate getCertificate(InputStream in) {
  87. try {
  88. CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);
  89. Certificate certificate = certificateFactory.generateCertificate(in);
  90. return certificate;
  91. } catch (Exception e) {
  92. throw new JCodecException(e);
  93. }
  94. }
  95. /** * 获得{@link Certificate} * * @param in * @param alias * @param password * @param keyStore * @return */
  96. public static Certificate getCertificate(InputStream in, String alias, char[] password, JKeyStore keyStore) {
  97. return getCertificate(in, alias, password, keyStore.getName());
  98. }
  99. /** * 获得{@link Certificate} * * @param in * @param alias * @param password * @param keyStore * @return */
  100. public static Certificate getCertificate(InputStream in, String alias, char[] password, String keyStore) {
  101. KeyStore ks = getKeyStore(in, password, keyStore);
  102. return getCertificate(ks, alias);
  103. }
  104. /** * 获得{@link Certificate} * * @param keyStore * @param alias * @return */
  105. public static Certificate getCertificate(KeyStore keyStore, String alias) {
  106. try {
  107. Certificate certificate = keyStore.getCertificate(alias);
  108. return certificate;
  109. } catch (Exception e) {
  110. throw new JCodecException(e);
  111. }
  112. }
  113. /** * 获得证书链 * * @param in * @param alias * @param password * @param keyStore * @return */
  114. public static Certificate[] getCertificateChain(InputStream in, String alias, char[] password, JKeyStore keyStore) {
  115. return getCertificateChain(in, alias, password, keyStore.getName());
  116. }
  117. /** * 获得证书链 * * @param in * @param alias * @param password * @param keyStore * @return */
  118. public static Certificate[] getCertificateChain(InputStream in, String alias, char[] password, String keyStore) {
  119. KeyStore ks = getKeyStore(in, password, keyStore);
  120. return getCertificateChain(ks, alias);
  121. }
  122. /** * 获得证书链 * * @param keyStore * @param alias * @return */
  123. public static Certificate[] getCertificateChain(KeyStore keyStore, String alias) {
  124. try {
  125. Certificate[] certificateChain = keyStore.getCertificateChain(alias);
  126. return certificateChain;
  127. } catch (Exception e) {
  128. throw new JCodecException(e);
  129. }
  130. }
  131. /** * 获得公钥 * * @param certificate * @return */
  132. public static PublicKey getPublicKey(Certificate certificate) {
  133. PublicKey key = certificate.getPublicKey();
  134. return key;
  135. }
  136. /** * 获得公钥 * * @param in * @return */
  137. public static PublicKey getPublicKey(InputStream in) {
  138. Certificate certificate = getCertificate(in);
  139. return getPublicKey(certificate);
  140. }
  141. /** * 获得公钥 * * @param in * @param alias * @param password * @param keyStore * @return */
  142. public static PublicKey getPublicKey(InputStream in, String alias, char[] password, JKeyStore keyStore) {
  143. return getPublicKey(in, alias, password, keyStore.getName());
  144. }
  145. /** * 获得公钥 * * @param in * @param alias * @param password * @param keyStore * @return */
  146. public static PublicKey getPublicKey(InputStream in, String alias, char[] password, String keyStore) {
  147. Certificate certificate = getCertificate(in, alias, password, keyStore);
  148. return getPublicKey(certificate);
  149. }
  150. /** * 获得公钥 * * @param keyStore * @param alias * @return */
  151. public static PublicKey getPublicKey(KeyStore keyStore, String alias) {
  152. Certificate certificate = getCertificate(keyStore, alias);
  153. return getPublicKey(certificate);
  154. }
  155. /** * 验证{@link Certificate}是否过期或无效 * * @param date * @param certificate * @return */
  156. public static boolean verifyCertificate(Date date, Certificate certificate) {
  157. X509Certificate x509Certificate = (X509Certificate) certificate;
  158. try {
  159. x509Certificate.checkValidity(date);
  160. return true;
  161. } catch (CertificateExpiredException e1) {
  162. return false;
  163. } catch (CertificateNotYetValidException e1) {
  164. return false;
  165. }
  166. }
  167. /** * 验证{@link Certificate}是否过期或无效 * * @param certificate * @return */
  168. public static boolean verifyCertificate(Certificate certificate) {
  169. return verifyCertificate(new Date(), certificate);
  170. }
  171. /** * 验证{@link Certificate}是否过期或无效 * * @param in * @return */
  172. public static boolean verifyCertificate(InputStream in) {
  173. Certificate certificate = getCertificate(in);
  174. return verifyCertificate(certificate);
  175. }
  176. /** * 验证{@link Certificate}是否过期或无效 * * @param date * @param in * @return */
  177. public static boolean verifyCertificate(Date date, InputStream in) {
  178. Certificate certificate = getCertificate(in);
  179. return verifyCertificate(date, certificate);
  180. }
  181. /** * 验证{@link Certificate}是否过期或无效 * * @param in * @param alias * @param password * @param keyStore * @return */
  182. public static boolean verifyCertificate(InputStream in, String alias, char[] password, JKeyStore keyStore) {
  183. return verifyCertificate(in, alias, password, keyStore.getName());
  184. }
  185. /** * 验证{@link Certificate}是否过期或无效 * * @param in * @param alias * @param password * @param keyStore * @return */
  186. public static boolean verifyCertificate(InputStream in, String alias, char[] password, String keyStore) {
  187. Certificate certificate = getCertificate(in, alias, password, keyStore);
  188. return verifyCertificate(certificate);
  189. }
  190. /** * 验证{@link Certificate}是否过期或无效 * * @param date * @param in * @param alias * @param password * @param keyStore * @return */
  191. public static boolean verifyCertificate(Date date, InputStream in, String alias, char[] password,
  192. JKeyStore keyStore) {
  193. return verifyCertificate(date, in, alias, password, keyStore.getName());
  194. }
  195. /** * 验证{@link Certificate}是否过期或无效 * * @param date * @param in * @param alias * @param password * @param keyStore * @return */
  196. public static boolean verifyCertificate(Date date, InputStream in, String alias, char[] password, String keyStore) {
  197. Certificate certificate = getCertificate(in, alias, password, keyStore);
  198. return verifyCertificate(date, certificate);
  199. }
  200. /** * 验证{@link Certificate}是否过期或无效 * * @param keyStore * @param alias * @return */
  201. public static boolean verifyCertificate(KeyStore keyStore, String alias) {
  202. Certificate certificate = getCertificate(keyStore, alias);
  203. return verifyCertificate(certificate);
  204. }
  205. /** * 验证{@link Certificate}是否过期或无效 * * @param date * @param keyStore * @param alias * @return */
  206. public static boolean verifyCertificate(Date date, KeyStore keyStore, String alias) {
  207. Certificate certificate = getCertificate(keyStore, alias);
  208. return verifyCertificate(date, certificate);
  209. }
  210. /** * 签名 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  211. public static byte[] sign(byte[] data, InputStream in, String alias, char[] password, JKeyStore keyStore) {
  212. return sign(data, in, alias, password, keyStore.getName());
  213. }
  214. /** * 签名 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  215. public static byte[] sign(byte[] data, InputStream in, String alias, char[] password, String keyStore) {
  216. // 获得证书
  217. Certificate certificate = getCertificate(in, alias, password, keyStore);
  218. // 取得私钥
  219. PrivateKey privateKey = getPrivateKey(in, alias, password, keyStore);
  220. return sign(data, certificate, privateKey);
  221. }
  222. /** * 签名 * * @param data * @param keyStore * @param alias * @param password * @return */
  223. public static byte[] sign(byte[] data, KeyStore keyStore, String alias, char[] password) {
  224. // 获得证书
  225. Certificate certificate = getCertificate(keyStore, alias);
  226. // 取得私钥
  227. PrivateKey privateKey = getPrivateKey(keyStore, alias, password);
  228. return sign(data, certificate, privateKey);
  229. }
  230. /** * 签名 * * @param data * @param certificate * @param privateKey * @return */
  231. public static byte[] sign(byte[] data, Certificate certificate, PrivateKey privateKey) {
  232. // 获得证书
  233. X509Certificate x509Certificate = (X509Certificate) certificate;
  234. return sign(data, privateKey, x509Certificate.getSigAlgName());
  235. }
  236. /** * 签名 * * @param data * @param privateKey * @param signatureAlgorithm * @return */
  237. public static byte[] sign(byte[] data, PrivateKey privateKey, String signatureAlgorithm) {
  238. return JCodecUtils.sign(data, privateKey, signatureAlgorithm);
  239. }
  240. /** * 验签 * * @param data * @param sign * @param in * @return */
  241. public static boolean verify(byte[] data, byte[] sign, InputStream in) {
  242. // 获得证书
  243. Certificate certificate = getCertificate(in);
  244. return verify(data, sign, certificate);
  245. }
  246. /** * 验签 * * @param data * @param sign * @param certificate * @return */
  247. public static boolean verify(byte[] data, byte[] sign, Certificate certificate) {
  248. // 获得证书
  249. X509Certificate x509Certificate = (X509Certificate) certificate;
  250. // 获得公钥
  251. PublicKey publicKey = x509Certificate.getPublicKey();
  252. return verify(data, sign, publicKey, x509Certificate.getSigAlgName());
  253. }
  254. /** * 验签 * * @param data * @param sign * @param publicKey * @param signatureAlgorithm * @return */
  255. public static boolean verify(byte[] data, byte[] sign, PublicKey publicKey, String signatureAlgorithm) {
  256. return JCodecUtils.verify(data, sign, publicKey, signatureAlgorithm);
  257. }
  258. /** * 验签 * * @param data * @param sign * @param keyStore * @param alias * @return */
  259. public static boolean verify(byte[] data, byte[] sign, KeyStore keyStore, String alias) {
  260. Certificate certificate = getCertificate(keyStore, alias);
  261. return verify(data, sign, certificate);
  262. }
  263. /** * 验签,遍历密钥库中的所有公钥 * * @param data * @param sign * @param keyStore * @return */
  264. public static boolean verify(byte[] data, byte[] sign, KeyStore keyStore) {
  265. try {
  266. Enumeration<String> aliasEnum = keyStore.aliases();
  267. while (aliasEnum.hasMoreElements()) {
  268. if (verify(data, sign, keyStore.getCertificate(aliasEnum.nextElement())))
  269. return true;
  270. }
  271. } catch (KeyStoreException e) {
  272. throw new JCodecException(e);
  273. }
  274. return false;
  275. }
  276. /** * 私钥加密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  277. public static byte[] encryptByPrivate(byte[] data, InputStream in, String alias, char[] password,
  278. JKeyStore keyStore) {
  279. return encryptByPrivate(data, in, alias, password, keyStore.getName());
  280. }
  281. /** * 私钥加密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  282. public static byte[] encryptByPrivate(byte[] data, InputStream in, String alias, char[] password, String keyStore) {
  283. PrivateKey privateKey = getPrivateKey(in, alias, password, keyStore);
  284. return encrypt(data, privateKey);
  285. }
  286. /** * 私钥加密 * * @param data * @param keyStore * @param alias * @param password * @return */
  287. public static byte[] encryptByPrivate(byte[] data, KeyStore keyStore, String alias, char[] password) {
  288. PrivateKey privateKey = getPrivateKey(keyStore, alias, password);
  289. return encrypt(data, privateKey);
  290. }
  291. /** * 私钥加密 * * @param data * @param privateKey * @return */
  292. public static byte[] encrypt(byte[] data, PrivateKey privateKey) {
  293. Cipher cipher = getCipher(privateKey, Cipher.ENCRYPT_MODE);
  294. return JCodecUtils.doFinal(data, cipher);
  295. }
  296. public static OutputStream wrapByPrivate(OutputStream out, InputStream in, String alias, char[] password,
  297. JKeyStore keyStore) {
  298. return wrapByPrivate(out, in, alias, password, keyStore.getName());
  299. }
  300. public static OutputStream wrapByPrivate(OutputStream out, InputStream in, String alias, char[] password,
  301. String keyStore) {
  302. PrivateKey privateKey = getPrivateKey(in, alias, password, keyStore);
  303. return wrap(out, privateKey);
  304. }
  305. public static OutputStream wrapByPrivate(OutputStream out, KeyStore keyStore, String alias, char[] password) {
  306. PrivateKey privateKey = getPrivateKey(keyStore, alias, password);
  307. return wrap(out, privateKey);
  308. }
  309. public static OutputStream wrap(OutputStream out, PrivateKey privateKey) {
  310. Cipher cipher = getCipher(privateKey, Cipher.ENCRYPT_MODE);
  311. return new JCipherOutputStream(cipher, out);
  312. }
  313. /** * 公钥加密 * * @param data * @param certificate * @return */
  314. public static byte[] encrypt(byte[] data, Certificate certificate) {
  315. PublicKey publicKey = certificate.getPublicKey();
  316. return encrypt(data, publicKey);
  317. }
  318. /** * 公钥加密 * * @param data * @param in * @return */
  319. public static byte[] encryptByPublic(byte[] data, InputStream in) {
  320. PublicKey publicKey = getPublicKey(in);
  321. return encrypt(data, publicKey);
  322. }
  323. /** * 公钥加密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  324. public static byte[] encryptByPublic(byte[] data, InputStream in, String alias, char[] password,
  325. JKeyStore keyStore) {
  326. return encryptByPublic(data, in, alias, password, keyStore.getName());
  327. }
  328. /** * 公钥加密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  329. public static byte[] encryptByPublic(byte[] data, InputStream in, String alias, char[] password, String keyStore) {
  330. PublicKey publicKey = getPublicKey(in, alias, password, keyStore);
  331. return encrypt(data, publicKey);
  332. }
  333. /** * 公钥加密 * * @param data * @param keyStore * @param alias * @return */
  334. public static byte[] encryptByPublic(byte[] data, KeyStore keyStore, String alias) {
  335. PublicKey publicKey = getPublicKey(keyStore, alias);
  336. return encrypt(data, publicKey);
  337. }
  338. /** * 公钥加密 * * @param data * @param publicKey * @return */
  339. public static byte[] encrypt(byte[] data, PublicKey publicKey) {
  340. Cipher cipher = getCipher(publicKey, Cipher.ENCRYPT_MODE);
  341. return JCodecUtils.doFinal(data, cipher);
  342. }
  343. public static OutputStream wrap(OutputStream out, Certificate certificate) {
  344. PublicKey publicKey = certificate.getPublicKey();
  345. return wrap(out, publicKey);
  346. }
  347. public static OutputStream wrapByPublic(OutputStream out, InputStream in) {
  348. PublicKey publicKey = getPublicKey(in);
  349. return wrap(out, publicKey);
  350. }
  351. public static OutputStream wrapByPublic(OutputStream out, InputStream in, String alias, char[] password,
  352. JKeyStore keyStore) {
  353. return wrapByPublic(out, in, alias, password, keyStore.getName());
  354. }
  355. public static OutputStream wrapByPublic(OutputStream out, InputStream in, String alias, char[] password,
  356. String keyStore) {
  357. PublicKey publicKey = getPublicKey(in, alias, password, keyStore);
  358. return wrap(out, publicKey);
  359. }
  360. public static OutputStream wrapByPublic(OutputStream out, KeyStore keyStore, String alias) {
  361. PublicKey publicKey = getPublicKey(keyStore, alias);
  362. return wrap(out, publicKey);
  363. }
  364. public static OutputStream wrap(OutputStream out, PublicKey publicKey) {
  365. Cipher cipher = getCipher(publicKey, Cipher.ENCRYPT_MODE);
  366. return new JCipherOutputStream(cipher, out);
  367. }
  368. /** * 私钥解密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  369. public static byte[] decryptByPrivate(byte[] data, InputStream in, String alias, char[] password,
  370. JKeyStore keyStore) {
  371. return decryptByPrivate(data, in, alias, password, keyStore.getName());
  372. }
  373. /** * 私钥解密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  374. public static byte[] decryptByPrivate(byte[] data, InputStream in, String alias, char[] password, String keyStore) {
  375. PrivateKey privateKey = getPrivateKey(in, alias, password, keyStore);
  376. return decrypt(data, privateKey);
  377. }
  378. /** * 私钥解密 * * @param data * @param keyStore * @param alias * @param password * @return */
  379. public static byte[] decryptByPrivate(byte[] data, KeyStore keyStore, String alias, char[] password) {
  380. // 取得私钥
  381. PrivateKey privateKey = getPrivateKey(keyStore, alias, password);
  382. return decrypt(data, privateKey);
  383. }
  384. /** * 私钥解密 * * @param data * @param privateKey * @return */
  385. public static byte[] decrypt(byte[] data, PrivateKey privateKey) {
  386. Cipher cipher = getCipher(privateKey, Cipher.DECRYPT_MODE);
  387. return JCodecUtils.doFinal(data, cipher);
  388. }
  389. public static InputStream wrapByPrivate(InputStream sIn, InputStream in, String alias, char[] password,
  390. JKeyStore keyStore) {
  391. return wrapByPrivate(sIn, in, alias, password, keyStore.getName());
  392. }
  393. public static InputStream wrapByPrivate(InputStream sIn, InputStream in, String alias, char[] password,
  394. String keyStore) {
  395. PrivateKey privateKey = getPrivateKey(in, alias, password, keyStore);
  396. return wrap(sIn, privateKey);
  397. }
  398. public static InputStream wrapByPrivate(InputStream sIn, KeyStore keyStore, String alias, char[] password) {
  399. PrivateKey privateKey = getPrivateKey(keyStore, alias, password);
  400. return wrap(sIn, privateKey);
  401. }
  402. public static InputStream wrap(InputStream sIn, PrivateKey privateKey) {
  403. Cipher cipher = getCipher(privateKey, Cipher.ENCRYPT_MODE);
  404. return new JCipherInputStream(cipher, sIn);
  405. }
  406. /** * 公钥解密 * * @param data * @param certificate * @return */
  407. public static byte[] decrypt(byte[] data, Certificate certificate) {
  408. PublicKey publicKey = certificate.getPublicKey();
  409. return decrypt(data, publicKey);
  410. }
  411. /** * 公钥解密 * * @param data * @param in * @return */
  412. public static byte[] decryptByPublic(byte[] data, InputStream in) {
  413. PublicKey publicKey = getPublicKey(in);
  414. return decrypt(data, publicKey);
  415. }
  416. /** * 公钥解密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  417. public static byte[] decryptByPublic(byte[] data, InputStream in, String alias, char[] password,
  418. JKeyStore keyStore) {
  419. return decryptByPublic(data, in, alias, password, keyStore.getName());
  420. }
  421. /** * 公钥解密 * * @param data * @param in * @param alias * @param password * @param keyStore * @return */
  422. public static byte[] decryptByPublic(byte[] data, InputStream in, String alias, char[] password, String keyStore) {
  423. PublicKey publicKey = getPublicKey(in, alias, password, keyStore);
  424. return decrypt(data, publicKey);
  425. }
  426. /** * 公钥解密 * * @param data * @param keyStore * @param alias * @return */
  427. public static byte[] decryptByPublic(byte[] data, KeyStore keyStore, String alias) {
  428. PublicKey publicKey = getPublicKey(keyStore, alias);
  429. return decrypt(data, publicKey);
  430. }
  431. /** * 公钥解密 * * @param data * @param publicKey * @return */
  432. public static byte[] decrypt(byte[] data, PublicKey publicKey) {
  433. Cipher cipher = getCipher(publicKey, Cipher.DECRYPT_MODE);
  434. return JCodecUtils.doFinal(data, cipher);
  435. }
  436. public static InputStream wrap(InputStream sIn, Certificate certificate) {
  437. PublicKey publicKey = certificate.getPublicKey();
  438. return wrap(sIn, publicKey);
  439. }
  440. public static InputStream wrapByPublic(InputStream sIn, InputStream in) {
  441. PublicKey publicKey = getPublicKey(in);
  442. return wrap(sIn, publicKey);
  443. }
  444. public static InputStream wrapByPublic(InputStream sIn, InputStream in, String alias, char[] password,
  445. JKeyStore keyStore) {
  446. return wrapByPublic(sIn, in, alias, password, keyStore.getName());
  447. }
  448. public static InputStream wrapByPublic(InputStream sIn, InputStream in, String alias, char[] password,
  449. String keyStore) {
  450. PublicKey publicKey = getPublicKey(in, alias, password, keyStore);
  451. return wrap(sIn, publicKey);
  452. }
  453. public static InputStream wrapByPublic(InputStream sIn, KeyStore keyStore, String alias) {
  454. PublicKey publicKey = getPublicKey(keyStore, alias);
  455. return wrap(sIn, publicKey);
  456. }
  457. public static InputStream wrap(InputStream sIn, PublicKey publicKey) {
  458. Cipher cipher = getCipher(publicKey, Cipher.DECRYPT_MODE);
  459. return new JCipherInputStream(cipher, sIn);
  460. }
  461. public static Cipher getCipher(Key key, int opmode) {
  462. JCodecUtils.checkOpMode(opmode);
  463. try {
  464. Cipher cipher = Cipher.getInstance(key.getAlgorithm());
  465. cipher.init(opmode, key);
  466. return cipher;
  467. } catch (Exception e) {
  468. throw new JCodecException(e);
  469. }
  470. }
  471. /** * 导出公钥证书 * * @param out * @param certificate * @param rfc */
  472. public static void export(OutputStream out, Certificate certificate, boolean rfc) {
  473. try {
  474. byte[] encoded = certificate.getEncoded();
  475. if (rfc) {
  476. out.write("-----BEGIN CERTIFICATE-----\r\n".getBytes());
  477. out.write(JBase64.getMimeEncoder().encode(encoded));
  478. out.write("\r\n-----END CERTIFICATE-----\r\n".getBytes());
  479. } else out.write(encoded);
  480. out.flush();
  481. } catch (Exception e) {
  482. throw new JCodecException(e);
  483. }
  484. }
  485. /** * 将密钥库转换为指定类型的密钥库 * * @param srcKeyStore * @param target * @param password * @param alias * 导出指定别名的证书 * @return */
  486. public static KeyStore convert(KeyStore srcKeyStore, JKeyStore target, char[] password, String... alias) {
  487. return convert(srcKeyStore, target.getName(), password, alias);
  488. }
  489. /** * 将密钥库转换为指定类型的密钥库 * * @param srcKeyStore * @param target * @param password * @param alias * 导出指定别名的证书 * @return */
  490. public static KeyStore convert(KeyStore srcKeyStore, String target, char[] password, String... alias) {
  491. try {
  492. KeyStore outputKeyStore = KeyStore.getInstance(target);
  493. outputKeyStore.load(null, password);
  494. if (alias.length == 0) {
  495. Enumeration<String> enums = srcKeyStore.aliases();
  496. while (enums.hasMoreElements()) {
  497. String keyAlias = enums.nextElement();
  498. copyKeyEntry(srcKeyStore, outputKeyStore, keyAlias, password);
  499. }
  500. } else {
  501. for (String keyAlias : alias) {
  502. copyKeyEntry(srcKeyStore, outputKeyStore, keyAlias, password);
  503. }
  504. }
  505. return outputKeyStore;
  506. } catch (Exception e) {
  507. throw new JCodecException(e);
  508. }
  509. }
  510. /** * 复制 * * @param src * @param target * @param alias * @param password * @throws UnrecoverableKeyException * @throws KeyStoreException * @throws NoSuchAlgorithmException */
  511. public static void copyKeyEntry(KeyStore src, KeyStore target, String alias, char[] password)
  512. throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
  513. if (src.isKeyEntry(alias)) {
  514. Key key = src.getKey(alias, password);
  515. Certificate[] certChain = src.getCertificateChain(alias);
  516. target.setKeyEntry(alias, key, password, certChain);
  517. }
  518. }
  519. }
  1. package com.jianggujin.codec.util;
  2. import java.security.KeyFactory;
  3. import java.security.KeyPair;
  4. import java.security.KeyPairGenerator;
  5. import java.security.PrivateKey;
  6. import java.security.PublicKey;
  7. import java.security.Signature;
  8. import java.security.spec.PKCS8EncodedKeySpec;
  9. import java.security.spec.X509EncodedKeySpec;
  10. import javax.crypto.Cipher;
  11. import javax.crypto.KeyGenerator;
  12. import javax.crypto.SecretKey;
  13. /** * 加解密工具 * * @author jianggujin * */
  14. public class JCodecUtils {
  15. /** * 获得私钥 * * @param privateKey * @param algorithm * @return */
  16. public static PrivateKey getPrivateKey(byte[] privateKey, String algorithm) {
  17. try {
  18. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);
  19. KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
  20. return keyFactory.generatePrivate(pkcs8KeySpec);
  21. } catch (Exception e) {
  22. throw new JCodecException(e);
  23. }
  24. }
  25. /** * 获得公钥 * * @param publicKey * @param algorithm * @return */
  26. public static PublicKey getPublicKey(byte[] publicKey, String algorithm) {
  27. try {
  28. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
  29. KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
  30. return keyFactory.generatePublic(keySpec);
  31. } catch (Exception e) {
  32. throw new JCodecException(e);
  33. }
  34. }
  35. /** * 检查加解密操作模式 * * @param opmode */
  36. public static void checkOpMode(int opmode) {
  37. if (opmode != Cipher.ENCRYPT_MODE && opmode != Cipher.DECRYPT_MODE)
  38. throw new IllegalArgumentException("opmode invalid");
  39. }
  40. /** * 签名 * * @param data * @param privateKey * @param signatureAlgorithm * @return */
  41. public static byte[] sign(byte[] data, PrivateKey privateKey, String signatureAlgorithm) {
  42. try {
  43. Signature signature = Signature.getInstance(signatureAlgorithm);
  44. signature.initSign(privateKey);
  45. signature.update(data);
  46. return signature.sign();
  47. } catch (Exception e) {
  48. throw new JCodecException(e);
  49. }
  50. }
  51. /** * 验签 * * @param data * @param sign * @param publicKey * @param signatureAlgorithm * @return */
  52. public static boolean verify(byte[] data, byte[] sign, PublicKey publicKey, String signatureAlgorithm) {
  53. try {
  54. Signature signature = Signature.getInstance(signatureAlgorithm);
  55. signature.initVerify(publicKey);
  56. signature.update(data);
  57. return signature.verify(sign);
  58. } catch (Exception e) {
  59. throw new JCodecException(e);
  60. }
  61. }
  62. /** * 按单部分操作加密或解密数据,或者结束一个多部分操作 * * @param data * @param cipher * @return */
  63. public static byte[] doFinal(byte[] data, Cipher cipher) {
  64. try {
  65. return cipher.doFinal(data);
  66. } catch (Exception e) {
  67. throw new JCodecException(e);
  68. }
  69. }
  70. /** * 初始化密钥 * * @param algorithm * @param keySize * @return */
  71. public static KeyPair initKey(String algorithm, int keySize) {
  72. try {
  73. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(algorithm);
  74. keyPairGen.initialize(keySize);
  75. return keyPairGen.generateKeyPair();
  76. } catch (Exception e) {
  77. throw new JCodecException(e);
  78. }
  79. }
  80. /** * 初始化密钥 * * @param algorithm * @return */
  81. public static SecretKey initKey(String algorithm) {
  82. try {
  83. KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
  84. SecretKey secretKey = keyGenerator.generateKey();
  85. return secretKey;
  86. } catch (Exception e) {
  87. throw new JCodecException(e);
  88. }
  89. }
  90. }

编写测试工具类,使用我们刚才生成的密钥库和证书文件进行测试:

  1. package com.jianggujin.codec.test;
  2. import java.io.FileOutputStream;
  3. import java.security.KeyStore;
  4. import java.security.PrivateKey;
  5. import java.security.PublicKey;
  6. import java.security.cert.X509Certificate;
  7. import java.text.SimpleDateFormat;
  8. import org.junit.Test;
  9. import com.jianggujin.codec.JBase64;
  10. import com.jianggujin.codec.JCertificate;
  11. import com.jianggujin.codec.JCertificate.JKeyStore;
  12. public class CertificateTest {
  13. @Test
  14. public void encode() throws Exception {
  15. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  16. char[] password = "123456".toCharArray();
  17. String alias = "www.jianggujin.com";
  18. String certificatePath = "test.cer";
  19. String keyStorePath = "test.pfx";
  20. byte[] data = "jianggujin".getBytes();
  21. KeyStore keyStore = JCertificate.getKeyStore(getClass().getResourceAsStream(keyStorePath), password,
  22. JKeyStore.JKS);
  23. X509Certificate certificate = (X509Certificate) JCertificate
  24. .getCertificate(getClass().getResourceAsStream(certificatePath));
  25. PrivateKey privateKey = JCertificate.getPrivateKey(keyStore, alias, password);
  26. PublicKey publicKey = JCertificate.getPublicKey(certificate);
  27. System.out.println("是否有效:" + JCertificate.verifyCertificate(certificate));
  28. System.out.println("使用者:" + certificate.getSubjectDN().getName());
  29. System.out.println("版本:" + certificate.getVersion());
  30. System.out.println("序列号:" + certificate.getSerialNumber().toString(16));
  31. System.out.println("签名算法:" + certificate.getSigAlgName());
  32. System.out.println("证书类型:" + certificate.getType());
  33. System.out.println("颁发者:" + certificate.getIssuerDN().getName());
  34. System.out.println(
  35. "有效期:" + format.format(certificate.getNotBefore()) + "到" + format.format(certificate.getNotAfter()));
  36. byte[] signResult = JCertificate.sign(data, keyStore, alias, password);
  37. System.out.println("签名:" + JBase64.getEncoder().encodeToString(signResult, "UTF-8"));
  38. System.out.println("证书验签:" + JCertificate.verify(data, signResult, certificate));
  39. System.out.println("密钥库验签:" + JCertificate.verify(data, signResult, keyStore));
  40. byte[] result = JCertificate.encrypt(data, privateKey);
  41. System.out.println("私钥加密:" + JBase64.getEncoder().encodeToString(result, "UTF-8"));
  42. System.out.println("公钥解密:" + new String(JCertificate.decrypt(result, publicKey)));
  43. result = JCertificate.encrypt(data, publicKey);
  44. System.out.println("公钥加密:" + JBase64.getEncoder().encodeToString(result, "UTF-8"));
  45. System.out.println("私钥解密:" + new String(JCertificate.decrypt(result, privateKey)));
  46. }
  47. public void convert() throws Exception {
  48. char[] password = "123456".toCharArray();
  49. String keyStorePath = "test.keystore";
  50. KeyStore keyStore = JCertificate.getKeyStore(getClass().getResourceAsStream(keyStorePath), password,
  51. JKeyStore.JKS);
  52. KeyStore target = JCertificate.convert(keyStore, JKeyStore.PKCS12, password);
  53. for (String alias : JCertificate.listAlias(target)) {
  54. System.out.println(alias);
  55. }
  56. target.store(new FileOutputStream("test.pfx"), password);
  57. }
  58. }

相关文章