Я пытаюсь разрешить Salesforce.com подключиться к экземпляру biztalk, который находится внутри нашей корпоративной сети. Между ними находится обратный прокси-сервер и серия межсетевых экранов.
Когда к обратному прокси-серверу выполняется стандартный HTTP-запрос, сервер biztalk отвечает правильно. Важно отметить, что обратный прокси-сервер работает правильно.
Что мне нужно сделать, так это включить безопасность, ограничив доступ к этой веб-службе только авторизованным клиентам. Изначально это просто Salesforce.com.
Salesforce.com предоставил свой сертификат SSL для аутентификации, и я поместил этот сертификат в файл httpd.conf с директивой SSLCACertificateFile.
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /opt/apache/veri/auth.crt
Когда SalesForce подключается и используются эти директивы, генерируется ошибка «javax.net.ssl.SSLPeerUnverifiedException: одноранговый узел не аутентифицирован».
Удаление SSLVerifyClient требует, и нормальная работа возобновляется.
Вот в чем проблема:
SSLCACertificateFile /opt/apache/veri/auth.crt
Как вы можете видеть в документация apache, SSLCACertificateFile означает путь к выдающий ЦС сертификат для сертификата клиента, а не для самого сертификата клиента. Нет возможности потребовать конкретный сертификат клиента как таковой. Однако вы можете потребовать, чтобы сертификат был выдан конкретным центром сертификации, а затем проверить CN сертификата.
Итак, вам нужно попросить своего клиента отправить вам публичную часть сертификата, который подписал его сертификат. Вам также необходимо проверить, какой CN содержится в их сертификате:
$ openssl x509 -in path/to/clientcert.crt -noout -text|grep Subject|grep CN
Subject: C=US, ST=Something, L=Something, O=Organization Name, OU=SomeOU, CN=host.name.example.com
Затем измените свою конфигурацию, чтобы она выглядела так:
SSLVerifyClient require
SSLRequire %{SSL_CLIENT_S_DN_CN} eq "host.name.example.com"
SSLVerifyDepth 1
SSLCACertificateFile /opt/apache/veri/auth.crt
Это сообщает Apache, что он будет принимать SSL-соединение, но только если имя хоста в сертификате host.name.example.com
и сертификат был подписан центром сертификации, чей сертификат находится в /opt/apache/veri/auth.crt
.
Больше информации на документация mod_ssl в Apache с несколькими примерами использования SSLRequire для проверки переменных в клиентских сертификатах.
Для аутентификации SSL требуется весь Цепочка ЦС, включая корневой ЦС, который должен находиться в CAfile или CApath. Мною было сделано предположение, что корневой ЦС в хранилище сертификатов OpenSSL был адекватным - это не так.
Добавление используемого корневого ЦС Verisign позволило проверить сертификат
<Location />
SSLVerifyClient optional
SSLVerifyDepth 10
SSLRequire (%{SSL_CLIENT_S_DN_CN} eq "<Partner CN name>")
SSLCACertificatePath /opt/apache/veri/CA
</Location>
Не забудьте перефразировать путь / opt / apache / veri / CA, если вы используете директиву SSLCACertificatePath.