1. 使用BC庫1.59版本已經(jīng)可以支持國密算法SM2/SM3/SM4,某大神寫的詳細(xì)測試?yán)樱篽ttps://github.com/ZZMarquis/gmhelper
2.?制作證書參考網(wǎng)上資料簡單例子;
``` java
public static void genSM2CertBySelf() throws OperatorCreationException, IOException, CertificateException {
String dn = "CN=dfg, OU=aert, O=45y, L=sdfg, ST=fg, C=CN";
long year = 360 * 24 * 60 * 60 * 1000;
Date notBefore = new Date();
Date notAfter = new Date(notBefore.getTime() + year);
//證書的名稱
? ? ? ? String fileName = "self"+new Date().getTime()/1000;
String path? = "/test/gmhelper/";
String rootCertPath = path+fileName+".der";
AsymmetricCipherKeyPair kp = Sm2Util.generateKeyPair();
ECPrivateKeyParameters bcecPrivateKey = (ECPrivateKeyParameters)kp.getPrivate();
ECPublicKeyParameters bcecPublicKey = (ECPublicKeyParameters)kp.getPublic();
BcX509v3CertificateBuilder build = new BcX509v3CertificateBuilder(
new X500Name(dn),
BigInteger.probablePrime(64, new Random()),
notBefore,
notAfter,
new X500Name(dn),
bcecPublicKey);
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SM3withSM2");//即"1.2.156.10197.1.501"
? ? ? ? AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find("SHA256");
ContentSigner sigGen = new BcECContentSignerBuilder(sigAlgId, digAlgId).build(bcecPrivateKey);
X509CertificateHolder x509certHolder = build.build(sigGen);
FileOutputStream outputStream = new FileOutputStream(rootCertPath);
outputStream.write(x509certHolder.getEncoded());
outputStream.close();
}
```
3. 使用上面介紹的制作證書方法如果跟GMSSL生成的證書比對缺少“公鑰參數(shù)”對象,因為BC庫公鑰是采用X9.62格式,見rfc5349?https://tools.ietf.org/html/rfc5349 ; 如果一定要帶公鑰參數(shù)對象,代碼去處理下ASN.1,把BcX509v3CertificateBuilder修改為X509v3CertificateBuilder,公鑰通過createSubjectECPublicKeyInfo做下轉(zhuǎn)換
``` java
public static SubjectPublicKeyInfo createSubjectECPublicKeyInfo(ECPublicKeyParameters pub)
{
? ? ASN1OctetString p = (ASN1OctetString)new X9ECPoint(pub.getQ()).toASN1Primitive();
? ? return new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, GMObjectIdentifiers.sm2p256v1), p.getOctets());
}
```
4. 自己如何構(gòu)造公鑰參數(shù)ECPublicKeyParameters參考:http://linuxgao.iteye.com/blog/2389904 ?如果要構(gòu)造私鑰參數(shù)類似如此操作,更簡單,因為私鑰參數(shù)ECPrivateKeyParameters只有一個大數(shù)BigInteger
5.?證書解析參考:https://blog.csdn.net/qq_32221419/article/details/59111828
6、證書請求及其它:參考?http://www.sitcoder.com/?post=54 和
https://blog.csdn.net/jinhill/article/details/17612273