Pozdravujem,
aku mate verziu Javy? Moze to suvisiet s
sun.security.ssl.allowUnsafeRenegotiation
Ono sa to menilo v istej verzii, pretoze to bola bezpecnostna chyba pri
znovunadvazovani session v SSL. Skuste pozriet [1].
RN
[1] http://java.sun.com/javase/javaseforbusiness/docs/TLSReadme.html
<http://java.sun.com/javase/javaseforbusiness/docs/TLSReadme.html>
On 7. 5. 2012 14:34, Dusan Zatkovsky wrote:
Dobry den ( ahoj ),
stale nic. Presiel som na apache http komponenty, stale bez uspechu,
javax.net.ssl.SSLException: HelloRequest followed by an unexpected
handshake message.
Truststorom to asi nebude, pretoze ten isty mnou vyrobeny jks ( narval
som tam vsetky postsignum certifikaty plus vyexportovane z browseru po
rucnom pokuse pripojit sa na tu url )
pouzivam pri autentifikacii cez login/password a tam to funguje,
Kod:
private static String keyStoreFile =
"/home/msk/work/misc/keys/private.pfx";
private static String trustStoreFile =
"/home/msk/work/misc/keys/postsignum.jks";
private static String keyStorePassword = "BLABLA";
private static String trustStorePassword = "123456";
private static String ts_url =
"https://www.postsignum.cz/DEMOTSA/TSS_crt/";
final HttpParams httpParams = new BasicHttpParams();
// keystore. Povazujem zan subor "private.pfx" od postsignum,
co je zda sa pkcs12 kontainer
KeyStore keystore = KeyStore.getInstance("pkcs12");
InputStream keystoreInput = new FileInputStream(new
File(keyStoreFile));
keystore.load(keystoreInput, keyStorePassword.toCharArray());
// truststore. Vyrobil som si sam a narval tam vsetky
postsignum certifikaty s ktorymi som prisiel do styku.
KeyStore truststore = KeyStore.getInstance("jks");
InputStream truststoreInput = new FileInputStream(new
File(trustStoreFile));
truststore.load(truststoreInput,
trustStorePassword.toCharArray());
final SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("https", 443, new
SSLSocketFactory(keystore, keyStorePassword, truststore)));
final DefaultHttpClient c = new DefaultHttpClient(new
ThreadSafeClientConnManager(httpParams, schemeRegistry), httpParams);
HttpPost post = new HttpPost(ts_url);
post.setParams(httpParams);
HttpResponse x = c.execute(post);
Skusil som zapnut debug, vid priloha. Vidim tam napr:
Found trusted certificate:
[
[
Version: V3
Subject: SERIALNUMBER=S7464, CN=www.postsignum.cz, OU=PostSignum
Services, O="Česká pošta, s.p. [IČ 47114983]", C=CZ
alebo
*** ServerHelloDone
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1
...
*** Finished
a potom
%% Cached client session: [Session-1, SSL_RSA_WITH_RC4_128_MD5]
main, setSoTimeout(0) called
main, WRITE: TLSv1 Application Data, length = 119
main, READ: TLSv1 Handshake, length = 20
*** HelloRequest (empty)
main, SEND TLSv1 ALERT: warning, description = no_negotiation
main, WRITE: TLSv1 Alert, length = 18
%% Invalidated: [Session-1, SSL_RSA_WITH_RC4_128_MD5]
Pravdupovediac, moc mudrejsi z toho nie som. Stale to na mna posobi,
ze druha strana usudila, ze sa so mnou bavit nebude a tu session
odstrihla.
Podotykam, ze sa mi stale nepodarilo uspesne spojit ani priamo ich
aplikaciou.
Diky.
--
Dusan
Pro standardní HTTPS komunikaci s přihlášením klientským certifikátem
musíte mít dvě úložiště klíčů - jedno pro ověření certifikátu serveru
(trustore) a druhé pro privární klíč, kterým se přihlašujete
(keystore). Bez trustore se lze obejít, pokud si implementujete
"ověřování" certifikátu protistrany, které bude věřit každému
certifikátu.
Použití HttpsURLConnection bych se snažil vyhnout, nedá se to
debugovat, jsou tam chyby, závislosti na globálních proměnných...
S pozdravem
Filip Jirsák
Dne 3. května 2012 15:24 Dusan Zatkovsky <[email protected]
<mailto:[email protected]>> napsal(a):
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/"
<https://www.postsignum.cz/DEMOTSA/TSS_crt/>;
private static String ts_url =
"https://tsa.postsignum.cz/TSS/HttpTspServer/"
<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