Java电子签名实现流程
1. 生成数字证书
数字证书是用于验证签名的关键组成部分,可以通过以下步骤生成数字证书:
步骤 | 操作 |
---|---|
1 | 生成密钥对(公钥和私钥) |
2 | 创建证书签发请求 |
3 | 申请数字证书 |
4 | 获取数字证书 |
1.1 生成密钥对
使用Java的KeyPairGenerator类生成密钥对,示例代码如下:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
public class KeyPairGeneratorExample {
public static void main(String[] args) throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // 设置密钥长度为2048位
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥和私钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
}
}
1.2 创建证书签发请求
创建证书签发请求(Certificate Signing Request,简称CSR)是向证书颁发机构申请数字证书的一种方式。可以使用Java的KeyStore类来创建CSR,示例代码如下:
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateParsingException;
import java.security.cert.CertPathBuilderException;
import java.security.cert.CertStoreException;
import java.security.cert.CertStoreParameters;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.PKIXBuilderParameters;
import java.security.cert.PKIXCertPathBuilderResult;
import java.security.cert.TrustAnchor;
import java.security.cert.X509CertSelector;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
public class CertificateSigningRequestExample {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); // 设置密钥长度为2048位
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 创建CSR
X500Name subject = new X500NameBuilder().addRDN(BCStyle.CN, "Your Name")
.addRDN(BCStyle.O, "Your Organization")
.addRDN(BCStyle.OU, "Your Organizational Unit")
.addRDN(BCStyle.C, "Your Country")
.build();
PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(subject, keyPair.getPublic());
JcaContentSignerBuilder signerBuilder = new JcaContentSignerBuilder("SHA256withRSA");
ContentSigner signer = signerBuilder.build(keyPair.getPrivate());
PKCS10CertificationRequest csr = csrBuilder.build(signer);
// 保存CSR到文件
try (FileOutputStream fos = new FileOutputStream("csr.csr")) {
fos.write(csr.getEncoded());
}
}
}
1.3 申请数字证书
将创建的CSR发送给证书颁发机构(Certificate Authority,简称CA),申请数字证书。申请过程可能需要支付费用,并需要填写相应的表单。
1.4 获取数字证书
证书颁发机构验证申请信息后,会生成数字证书并发送给申请者。申请者需要将收到的数字证书保存在本地。
2. 签名与验证
签名是使用私钥对数据进行加密,验证是使用公钥对签名进行解密并比对原始数据的过程。可以使用以下步骤实现签名与验证:
步骤 | 操作 |
---|---|
1 | 加载数字证书和私钥 |
2 | 对需要签名的数据进行加密 |
3 | 使用私钥进行签名 |
4 | 验证签名 |
2.1 加载数字证书和私钥
使用Java的KeyStore类加载数字证书和私钥,示例代码如下:
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
public class CertificateLoader {
public static void main(String[] args)