public static OutputStream unterzeichnen( PrivateKey mKey, X509Certificate myCert,
byte[] daten) throws FileNotFoundException {
//FileOutputStream out = new FileOutputStream("C:\\ssl\\certs\\");
// Ausgabe
// Sind Variablen die wichtigen Daten beeinhalten.
OutputStream ausgabe = new ByteArrayOutputStream();
String digestAlgorithm = "SHA1"; // FesteWerte die wir später benötigern
String signingAlgorithm = "SHA1withRSA"; // der Algom mit dem das ganze
// Signiert wurde
PrivateKey priv = mKey; // PrivateKey uns zu anfang noch null.
X509Certificate x509 = myCert;
PKCS7 p7 = null;
try {
AlgorithmId[] digestAlgorithmIds = new AlgorithmId[] { AlgorithmId
.get(digestAlgorithm) };
MessageDigest md = MessageDigest.getInstance(digestAlgorithm); // DigestAlgo
// SHA1
// wird
// übergeben.
md.update(daten); // Daten welche Daten sogennante EinwegHast ist
// das MessageDigest.
// die Daten werden sozusgaen zuerst
// initialisiert. mit Update.
byte[] digestedContent = md.digest(); // liefert den HashWert an den
// digestedContent weiter.
// Wieso dieser teil kommt weiß ich nicht so genau anscheinend
// liefert es wichtige Infors
// wie z.B. wann das das Attribute signiert wurd mit welchem Algo
// usw...
PKCS9Attribute[] authenticatedAttributeList = {
new PKCS9Attribute(PKCS9Attribute.CONTENT_TYPE_OID,
ContentInfo.DATA_OID),
new PKCS9Attribute(PKCS9Attribute.SIGNING_TIME_OID,
new java.util.Date()),
new PKCS9Attribute(PKCS9Attribute.MESSAGE_DIGEST_OID,
digestedContent) };
// Eine neue Attributsliste wird mit den Attributen erstellt.
PKCS9Attributes authenticatedAttributes = new PKCS9Attributes(
authenticatedAttributeList);
// hier wird das Cert erstellt wobei der keyStore dafür genutzt wird
// anscheinden.
//--> nicht notwendig //x509 = (X509Certificate) keyStore.getCertificateChain(alias)[0];
// das alias ist der Alias name des Zertifikates unterdem der dieses
// Cert bekannt ist.
// daraus wird dann der PrivateKey genommen.
// Nicht notwendig--> //priv = (PrivateKey) keyStore.getKey(alias, null);
// hier wird eine Siganture erzeugt mit dem SignierungsAlgo
Signature signer = Signature.getInstance(signingAlgorithm);
// der Private schlüsselwird signiert.
signer.initSign(priv);
// ???
signer.update(authenticatedAttributes.getDerEncoding());
byte[] signedAttributes = signer.sign();
// die ConentInfo wird angelegt fpr das Cert.
ContentInfo contentInfo = null;
contentInfo = new ContentInfo(ContentInfo.DATA_OID, new DerValue(
DerValue.tag_OctetString, daten));
X509Certificate[] certificates = { x509 };
java.math.BigInteger serial = x509.getSerialNumber();
// SignerInformationen anlegen wer das Cert Signiert hat.
SignerInfo si = new SignerInfo(new X500Name(x509.getIssuerDN()
.getName()), serial,
AlgorithmId.getAlgorithmId(digestAlgorithm),
authenticatedAttributes, new AlgorithmId(
AlgorithmId.RSAEncryption_oid), signedAttributes,
null); // hier die Informationen zum Signierer der das die Signierzng durchgeführt hat
// Die Inforamtionen wweden dann alls Array apgespeichert und dann an das PKCS7 Konstruktor übergeben.
// Die Infos werden in einem Array gespeichert um Sie an den PKCS7 Konstruktor zu übergeben.
SignerInfo[] signerInfos = { si };
p7 = new PKCS7(digestAlgorithmIds, contentInfo, certificates,
signerInfos); // hier die Erzegung des Cert.
p7.encodeSignedData(ausgabe);
// Test ob Verifizierung funktioniert.
try {
p7.verify();
} catch (Exception e) {
System.out.println("Error en validacion:" + e.getMessage());
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
return ausgabe ; // Rückgabe des PKCS Zerts p7
}