Как сделать взаимную аутентификацию SSL в java - PullRequest
2 голосов
/ 29 февраля 2020

Я хочу выполнить взаимную аутентификацию SSL с использованием кода java, но я не добился успеха. У меня есть файл key.pem и cert.pem для аутентификации. Я пробовал его с помощью Curl

curl -X POST -d '{ "Channel": "....}' -H "Content-Type: application/json" -H "Auth1: ***" -H "Auth2: ***" -k https://******/webservices/JSON/Default.aspx --cert "cert.pem" --key "Key.pem"

и все работало нормально, тогда я пытался создать java ссылку на программу Отправить запрос https в java, используя файл .pem , но сервер возвращает "CERT_MISSING". Я также попробовал с этим https://www.naschenweng.info/2018/02/01/java-mutual-ssl-authentication-2-way-ssl-authentication/ этот код, создающий файлы p12, crt и jks, как указано в ссылке выше, но все равно получаю ту же ошибку "CERT_MISSING". Это работает NodeJS пример:

var https = require("https");
var fs = require("fs");

var jsonData = {
    "Channel": ....
}

var options = {
    hostname: "****",
    port: 443,
    path: '/webservices/JSON/Default.aspx',
    method: 'POST',
    timeout: this.TimeOut,
    headers: {'Content-Type':'application/json',"Auth1": "****","Auth2": "*****"},
    json: true,
    key: fs.readFileSync('Key.pem'),
    cert: fs.readFileSync('cert.pem')
}

var req = https.request(options, function(res) {
    res.on('data', function(data) {
        var response = JSON.parse(data)
            console.log(response)

            req.end();
    });
});
req.on('error', function(e) {
    console.log("ERROR:");

    })


req.write(JSON.stringify(jsonData));
req.end();

Пожалуйста, помогите мне в этом.

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

Я думаю, что вам нужен файл "internediate-cert", чтобы объединить все сертификаты в один файл PEM, например cat "internediate-cert.pem" "codika_cert.pem" "Key.pem" > full-chain.keycert.pem, затем сгенерируйте хранилище ключей PKCS12 (.p12) с псевдонимом и паролем, например pkcs12 -export -in "full-chain.keycert.pem" -out full-chain.keycert.p12 -name alias -noiter -nomaciter, затем используйте full-chain.keycert.p12 в качестве хранилища ключей. с паролем. Он должен работать.

1 голос
/ 29 февраля 2020

Я просто попытаюсь вспомнить несколько вещей, чтобы, возможно, заполнить ваш контрольный список. Я не могу привести полный пример. Я предполагаю, что вы контролируете как клиентский, так и серверный код. Или, по крайней мере, клиентский код и полная настройка конфигурации сервера.

0 - используйте wireshark, чтобы узнать, что происходит.

1 - убедитесь, что ваша сторона сервера отправляет сертификат accept-client-cert или требует-клиента-сертификат на сервере hello. Curl может работать только потому, что сервер не «требует» его, а только запрашивает его.

2 - убедитесь, что подписчик сертификата клиента будет доверен серверу. Иногда это означает взломать хранилище сертификатов (CA) сервера, если вы будете делать самоподписанный сертификат клиента при тестировании.

3 - с помощью wireshark, посмотрите диалог ssl / tls и убедитесь, что как clienthello, так и serverhello ожидается (в основном, если serverhello запрашивает / требует аутентификации клиента и если клиент даже пытается отправить его). Во всяком случае, это довольно познавательно.

4-напишите тривиальный код, используя руководства по jsse снизу вверх. сделать код ката, чтобы увидеть, есть ли хранилище ключей / castore, содержит то, что вы ожидаете. Затем перейдите к безопасной настройке сокета [server], keymanager, trustmanager и hostnameverifier (с или без опасного обхода двух последних, которые некоторые осмеливаются предложить). Когда эти 4 части настроены, вы готовы на 99%, и ваш сокет ssl / tls должен работать. Несколько вещей, которые обычно могут помешать вашему соединению ssl / tls, - это несовместимый набор шифров или версия tls, или сертификаты с недопустимыми датами. Поскольку вы управляете и клиентом, и сервером, это не должно вызывать проблем.

5 - как только вы можете доверять поведению на стороне клиента, вы можете попытаться подключиться к серверу https, как tomcat или jetty (я не знаю, что вы используете) и отправляете сырой GET на sslsocket с вашим java клиентом.

6-Когда это работает, теперь вы можете передать свой sslsocketfactory многим стекам http [s] (smtp, httplient, даже core JDK httpurlconnection).

...