Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.12.2014(UTC) Сообщений: 76
Сказал(а) «Спасибо»: 3 раз
|
Есть клиентский сертификат с закрытым ключом, есть ресурс, который требует этот сертификат при подключении. Сертификат сервера добавлен в доверенные. Все это проделано одновременно и в КриптоПро CSP и в JCP. Теперь если зайти IE на ресурс, то он исправно сросит сертификат, отдаст свой, отдаст содержимое страницы. Это ОК. Если зайти с тем же сертификатом на https://cpca.cryptopro.ru/tls/tls-cli.asp, то видно сообщение "Защищенное соединение установлено, Сертификат пользователя не предоставлен" - Странно. Далее если подключиться из Java со всеми теми же сертификатами к https://cpca.cryptopro.ru/tls/tls-cli.asp, то результат тот же - "Сертификат пользователя не предоставлен", а если подключиться к требуемому ресурсу, то соединение и вовсе обрывается после отправки запроса и при попытке что-то считать из сокета. При этом в логах почему-то нет попытки сервера запросить клиентский сертификат и клиент, соответственно, его не отправляет, хотя видно, что CryptoPro про него в приципе знает. Вот код (Scala, но не велика разница с Java): Код: System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");
System.setProperty("javax.net.ssl.keyStorePassword", "1");
System.setProperty("javax.net.ssl.trustStoreType", "HDImageStore");
System.setProperty("javax.net.ssl.trustStorePassword", "12345");
System.setProperty("javax.net.ssl.trustStore", "C:\\crypto_store");
val url: URL = new URL(URI)
val conn = url.openConnection.asInstanceOf[HttpsURLConnection]
try
{
conn.setRequestMethod("POST")
conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8")
conn.setRequestProperty("X-Signature", "test") // TODO
conn.setRequestProperty("X-Async", "1")
conn.setRequestProperty("Accept", "text/xml; text/html; text/plain")
conn.setRequestProperty("Accept-Charset", "UTF-8")
conn.setDoOutput(true)
conn.setDoInput(true)
val data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + // Кусок запроса пропущен
val wr = new OutputStreamWriter(conn.getOutputStream)
wr.write(data)
wr.flush()
wr.close()
writeToFile(conn)
}
catch
{
case t: Throwable => t.printStackTrace(System.err)
}
finally
{
conn.disconnect()
}
private def writeToFile(conn: HttpsURLConnection)
{
val input: BufferedInputStream = new BufferedInputStream(conn.getInputStream)
val output: BufferedOutputStream = new BufferedOutputStream(new FileOutputStream("output.txt"))
val buffer: Array[Byte] = new Array[Byte](1024)
var len: Int = 0
while ({len = input.read(buffer, 0, 1024); len} > 0)
output.write(buffer, 0, len)
output.flush()
output.close()
input.close()
}
Вот вывод логов: http://pastebin.com/Vi67YKYTЕсли включить вывод логов в ALL, то видно, что в сокет нормально пишется весь POST-запрос, со всеми заголовками. Но все падает в момент conn.getInputStream Что сделать, чтобы заработало? Для начала, чтобы серверу отправлялся клиентский сертификат - может, полегчает?
|