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)