Ahoj,
postupil som dalej, ale o moc zas nie.
private static SSLSocketFactory getFactory() throws ...{
KeyManagerFactory keyManagerFactory =
KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream keyInput = new FileInputStream(new
File(clientJksFile));
keyStore.load(keyInput, clientJksPasswd.toCharArray());
keyInput.close();
keyManagerFactory.init(keyStore, clientJksPasswd.toCharArray());
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(), null, new
SecureRandom());
return context.getSocketFactory();
}
void test() {
//private static String ts_url =
"https://www.postsignum.cz/DEMOTSA/TSS_crt/";
private static String ts_url =
"https://tsa.postsignum.cz/TSS/HttpTspServer/";
...
Security.addProvider(new BouncyCastleProvider());
// tu mam certifikaty postsignum k overeniu ssl cert path
System.setProperty("javax.net.ssl.trustStore", caJksFile);
System.setProperty("javax.net.ssl.trustStorePassword",
caJksPasswd);
// generuj request
TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
TimeStampRequest request = reqGen.generate(TSPAlgorithms.SHA1,
new byte[20]);
byte[] reqData = request.getEncoded();
// posli request
SSLSocketFactory sslfact = getFactory();
URL url = new URL(ts_url);
HttpsURLConnection c = (HttpsURLConnection) url.openConnection();
c.setSSLSocketFactory(sslfact);
c.setDoOutput(true);
c.setDoInput(true);
c.setRequestMethod("POST");
c.setRequestProperty("Content-type",
"application/timestamp-query");
c.setRequestProperty("Content-length",
String.valueOf(reqData.length));
OutputStream out = c.getOutputStream();
out.write(reqData);
out.flush();
if (c.getResponseCode() != HttpURLConnection.HTTP_OK) {
...
}
V getResponseCode() koncim na javax.net.ssl.SSLHandshakeException:
Received fatal alert: handshake_failure.
Vzhladom na to, ze som skusil aj oficialneho TSA klienta od PostSignum,
ktory koncil s podobnou vynimkou by mohol byt problem
zakopany prave v certifikate a skusim sa vydat najprv touto cestou.
V com mam trosku gulas ale je, ze v aplikacii TSA sa pridava privatny
kluc ( s heslom ), kdezto na autentikaciu sa pouzije certifikat. Ale
predpokladam,
ze ta aplikacia si certifikat vygeneruje z privatneho kluca...
Diky
--
Dusan
Zdravím,
přihlášení je standardní HTTPS přihlášení klientským certifikátem, ne?
Použijte třeba HttpClient z Apache HttpComponents (
http://hc.apache.org/httpcomponents-client-ga/index.html ), použití
HTTPS je tam myslím někde v příkladech.
S pozdravem
Filip Jirsák
2012/5/2 Dusan Zatkovsky <[email protected] <mailto:[email protected]>>
Ahoj,
implementoval niekto z Vas casove razitko od postsignum s
prihlasenim certifikatom?
Vygooglit sa mi nic zatial nepodarilo, v podstate som zatial
pripravil hash a odoslal na
server, ale nemam doriesenu autentifikaciu.
Security.addProvider(new BouncyCastleProvider());
TimeStampRequestGenerator reqGen = new
TimeStampRequestGenerator();
TimeStampRequest request =
reqGen.generate(TSPAlgorithms.SHA1, new byte[20]);
byte[] reqData = request.getEncoded();
String s_url = "https://www.postsignum.cz/DEMOTSA/TSS_crt/";
URL url = new URL(s_url);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setDoOutput(true);
c.setDoInput(true);
c.setRequestMethod("POST");
c.setRequestProperty("Content-type",
"application/timestamp-query");
c.setRequestProperty("Content-length",
String.valueOf(reqData.length));
OutputStream out = c.getOutputStream();
out.write(reqData);
out.flush();
InputStream in = c.getInputStream();
TimeStampResp resp = TimeStampResp.getInstance(new
ASN1InputStream(in).readObject());
TimeStampResponse response = new TimeStampResponse(resp);
response.validate(request);
Diky
--
Dusan