Подпишите данные с сертификатом .pfx и pkcs7 в java - PullRequest
0 голосов
/ 25 мая 2020

У меня есть сертификат .pfx и пароль. Теперь я хочу поставить цифровую подпись для данных, используя .pfx, а затем сгенерировать строку в кодировке pkcs7.

Насколько мне известно, я написал код ниже. Пожалуйста, позвольте мне, что не так в этом коде:

byte[] origMsg;
String msg = "1004546640";
byte[] base64Encoded = Base64.encodeBase64(msg.getBytes());
Charset ascii = Charset.forName("US-ASCII");
String asciiEncoded = new String(base64Encoded, ascii);
//First load the keystore object by providing the p12 file path
KeyStore clientStore = KeyStore.getInstance("PKCS12");
//replace testPass with the p12 password/pin
clientStore.load(new FileInputStream(STORENAME), STOREPASS.toCharArray());

Enumeration<String> aliases = clientStore.aliases();
String aliaz = "";
while(aliases.hasMoreElements()){
    aliaz = aliases.nextElement();
    if(clientStore.isKeyEntry(aliaz)){
        break;
    }
}
X509Certificate c = (X509Certificate)clientStore.getCertificate(aliaz);

//Data to sign
byte[] dataToSign = "1004546640".getBytes();
//compute signature:
Signature signature = Signature.getInstance("Sha1WithRSA");
signature.initSign((PrivateKey)clientStore.getKey(aliaz, STOREPASS.toCharArray()));
signature.update(dataToSign);
byte[] signedData = signature.sign();

//load X500Name
X500Name xName      = X500Name.asX500Name(c.getSubjectX500Principal());
//load serial number
BigInteger serial   = c.getSerialNumber();
//laod digest algorithm
AlgorithmId digestAlgorithmId = new AlgorithmId(AlgorithmId.SHA_oid);
//load signing algorithm
AlgorithmId signAlgorithmId = new AlgorithmId(AlgorithmId.RSAEncryption_oid);

//Create SignerInfo:
SignerInfo sInfo = new SignerInfo(xName, serial, digestAlgorithmId, signAlgorithmId, signedData);
//Create ContentInfo:
ContentInfo cInfo = new ContentInfo(ContentInfo.DIGESTED_DATA_OID, new DerValue(DerValue.tag_OctetString, dataToSign));
//Create PKCS7 Signed data
PKCS7 p7 = new PKCS7(new AlgorithmId[] { digestAlgorithmId }, cInfo,
        new java.security.cert.X509Certificate[] { c },
        new SignerInfo[] { sInfo });
//Write PKCS7 to bYteArray
ByteArrayOutputStream bOut = new DerOutputStream();
p7.encodeSignedData(bOut);
byte[] encodedPKCS7 = bOut.toByteArray();
String st = Base64.getEncoder().encodeToString(encodedPKCS7);
System.out.println(st);
...