Назад | Перейти на главную страницу

Проверка подлинности сертификата от Salesforce.com через обратный прокси-сервер

Я пытаюсь разрешить 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.