Re: Pass X509Certificate as String?
On 2/8/2013 7:21 PM, Arne Vajh?j wrote:
On 2/8/2013 7:12 PM, Arne Vajh?j wrote:
On 2/8/2013 6:48 PM, Ian Pilcher wrote:
This is a bit weird. I am writing an SSLSocketFactory for use with the
PostgreSQL JDBC driver. Unfortunately, the driver imposes some very
inconvenient criteria on the factory class.
http://jdbc.postgresql.org/documentation/91/ssl-factory.html
In particular, the class must have a zero-argument constructor or a
constructor that takes a single String argument. My challenge is to
somehow pass a java.security.cert.X509Certificate to this constructor.
The only idea I've been able to come up with thus far is to serialize
the certificate to a ByteArrayOutputStream, convert that to a String,
and reverse the process in the constructor.
Does anyone have a better idea?
I believe it is common to use Bas64 encoding of DER encoding
of the certificate.
Maybe you can use that!?
The methods must be getInstance and getEncoded.
Code snippet:
public static String b64encode(byte[] b) throws MessagingException,
IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream b64os = MimeUtility.encode(baos, "base64");
b64os.write(b);
b64os.close();
return new String(baos.toByteArray());
}
public static byte[] b64decode(String s) throws
MessagingException, IOException {
ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
InputStream b64is = MimeUtility.decode(bais, "Base64");
byte[] tmp = new byte[s.length()];
int n = b64is.read(tmp);
byte[] res = new byte[n];
System.arraycopy(tmp, 0, res, 0, n);
return res;
}
public static String encode(X509Certificate cert) throws
CertificateEncodingException, MessagingException, IOException {
return b64encode(cert.getEncoded());
}
public static X509Certificate decode(String s) throws
CertificateException, MessagingException, IOException {
return X509Certificate.getInstance(b64decode(s));
}
Arne