ok nu kan jeg signe mine mails i java med mit cert fra tdc!
Om det er den bedste måde at gøre det på tvivler jeg på da jeg ærlig talt ikke forstår at det overhovedet er lykkedes mig ;)
men her er koden
package blaa;
import java.io.*;
import java.security.*;
import java.security.cert.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import org.bouncycastle.mail.smime.*;
/**
* a simple example that creates a single signed mail message.
*/
public class CreateSignedMail {
public static void main(String[] args) throws Exception
{
// Genererer et keystore objekt af typen PKCS12 som tester.pfx er
KeyStore keyStore = KeyStore.getInstance("PKCS12");
// læser tester.pfx ind
FileInputStream fis = new FileInputStream("tester.pfx");
// laver password på tester.pfx om til char array
char[] key = "password".toCharArray();
// loader tester.pfx fra inputstream
keyStore.load( (InputStream) fis, key);
/**
* Der er sikkert en smartere måde men jeg har ikke rigtigt forstået det med alias
* Så jeg finder bare det første alias..vist også det eneste og bruger det til at finde cert,privatekey
*/
Enumeration e = keyStore.aliases();
String alias = (String) e.nextElement();
// henter private key ved at angive alias og password
PrivateKey pk = (PrivateKey) keyStore.getKey(alias, key);
// Henter certificatet ud fra alias
X509Certificate pkcs12Cert = (X509Certificate) keyStore.getCertificate(alias);
// bruges til at signe en message
SMIMESignedGenerator gen = new SMIMESignedGenerator();
// tilføjer cert
gen.addSigner(pk, pkcs12Cert, SMIMESignedGenerator.DIGEST_SHA1);
//
// laver beskeden
//
MimeBodyPart msg = new MimeBodyPart();
// sætter text i beskeden
msg.setText("Hello world! ...");
MimeMultipart mm = gen.generate(msg, "BC");
Properties props = System.getProperties();
props.put("mail.smtp.host", "smtp.mail.dk");
Session session = Session.getDefaultInstance(props, null);
Address fromUser = new InternetAddress("\"Simon Nyborg Valter\"<simon@valter.info>");
Address toUser = new InternetAddress("mail@gbit.dk");
MimeMessage body = new MimeMessage(session);
body.setFrom(fromUser);
body.setRecipient(Message.RecipientType.TO, toUser);
body.setSubject("Example signed message");
body.setContent(mm, mm.getContentType());
body.saveChanges();
Transport.send(body);
}
}
For at få det til at virke skal du besøge
http://www.bouncycastle.org/latest_releases.htmlog hente:
bcmail-jdk14-123.jar
bcprov-jdk14-123.jar
disse 2 skal være i din classpath
og så skal du tilføje en security provider
det gør du ved at tilføje dette til
\jre\lib\security\java.security
security.provider.<nr>=org.bouncycastle.jce.provider.BouncyCastleProvider
Jeg vil meget gerne have forslag til alternative eller mere optimale måder at gøre dette på!