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

Apache2.4: пересылка прокси-сервера для аутентификации сертификата клиента в IIS7

У нас есть веб-сервисы Asp.Net 1.1 (https: //dev-ms01/MsgService/default.asmx), работающей на IIS7 (стандарт win server 2008), мы настроили аутентификацию сертификата клиента в IIS, и ниже .netкод для ClientCertificate аутентификация

private void Authenticate(DataTable dtUserMap,HttpContext context)
    {
        /// Convert the serial number from IIS to the DC format
        /// which is: no dashs octets are in proper order.
        string SerialNum = context.Request.ClientCertificate.SerialNumber.Replace("-","");

        Debug.WriteLine("Authenticate User with cert = " + SerialNum);

        /// get the column names from the table
        string[] columnNames = new String[dtUserMap.Columns.Count];

        /// populate the string array with the names
        for(int i=0;i<dtUserMap.Columns.Count;i++)
        {
            columnNames[i] = dtUserMap.Columns[i].ColumnName;
        }

        /// Run a select query with the serial number
        DataRow[] rows = dtUserMap.Select("SerialNumber='" + SerialNum + "'");
        if (rows.Length==1){
            /// the user exits
            Debug.WriteLine("User Authenticated");
            // further logic
        }
        else
        {
            /// either too many users or not any users
            Debug.WriteLine("No single User Found");
            context.Items.Add("IsAuthenticated",false);
        }
    }

Мы настраиваем сервер apache2.4 для поддержки TLS 1.2, а также действует как прокси для IIS, ниже представлена ​​конфигурация apache.

<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"  
ServerName  secure-dev-ms01
SSLEngine on
SSLProtocol -ALL TLSv1.2

SSLVerifyClient optional
SSLVerifyDepth  3


<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "C:/elm/apache/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>


SSLProxyEngine On
SSLOptions +ExportCertData
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
#ProxyPass should be prior to any other Proxy directives    
ProxyPass        /  http://dev-ms01:80/
ProxyPassReverse /  http://dev-ms01:80/ 

RewriteEngine  on

RequestHeader set X_SSL_CLIENT_M_SERIAL "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set X_FORWARDED_PROTO "https" env=HTTPS
RequestHeader set SslSubject "%{SSL_CLIENT_S_DN}s"
</VirtualHost>

Когда я просматриваю https: //secure-dev-ms01/MsgService/default.asmx URL-адрес запрашивает сертификат клиента, и когда я выбираю сертификат клиента, я не вижу авторизованный контент, который должен видеть, я подозреваю SSLOptions +ExportCertData конфигурация apache не пересылает сертификат клиента на IIS. Я не смог найти много информации / статей о том, как пересылать сертификат клиента из apache в IIS.

Может ли кто-нибудь помочь мне настроить apache с прямым прокси для аутентификации сертификата клиента в IIS?

Обновление 1:

Пытался перенаправить запросы на https://dev-ms01/ вместо того http://dev-ms01:80/ а также установка SSL_* заголовки запросов в Apache VirtualHost, как показано ниже, но все равно не повезло

SSLProxyEngine On
SSLOptions +ExportCertData +StdEnvVars 
#ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
#ProxyPass should be prior to any other Proxy directives
ProxyPass   / https://dev-ms01/
ProxyPassReverse   / https://dev-ms01/
RewriteEngine  on

RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}s"
RequestHeader set SSL_CLIENT_I_DN "%{SSL_CLIENT_I_DN}s"
RequestHeader set SSL_SERVER_S_DN_OU "%{SSL_SERVER_S_DN_OU}s"
RequestHeader set SSL_CLIENT_S_DN_CN "%{SSL_SERVER_S_DN_CN}s"
RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s"
RequestHeader set SSL_CLIENT_V_START "%{SSL_CLIENT_V_START}s"
RequestHeader set SSL_CLIENT_V_END "%{SSL_CLIENT_V_END}s"
RequestHeader set SSL_CLIENT_M_VERSION "%{SSL_CLIENT_M_VERSION}s"
RequestHeader set SSL_CLIENT_M_SERIAL "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
RequestHeader set SSL_CLIENT_CERT_CHAIN_0 "%{SSL_CLIENT_CERT_CHAIN_0}s"
RequestHeader set SSL_CLIENT_CERT_CHAIN_1 "%{SSL_CLIENT_CERT_CHAIN_1}s"
RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s"
RequestHeader set SSL_SERVER_M_VERSION "%{SSL_SERVER_M_VERSION}s"
RequestHeader set SSL_SERVER_I_DN "%{SSL_SERVER_I_DN}s"
RequestHeader set SSL_SERVER_CERT "%{SSL_SERVER_CERT}s"
RequestHeader set X_SSL_CLIENT_M_SERIAL "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set X_FORWARDED_PROTO "https" env=HTTPS
RequestHeader set SslSubject "%{SSL_CLIENT_S_DN}s"

AFAIK, если Apache завершит запрос TLS, из IIS не будет никакого способа увидеть исходный сертификат клиента. Функция прокси Apache не может инициировать запрос https, который будет иметь исходный сертификат клиента, поскольку Apache не будет иметь доступа к соответствующему закрытому ключу.

SSLOptions + ExportCertData конфигурация apache не пересылает сертификат клиента в IIS

Это не то, что ExportCertData вариант делает. Эти параметры просто устанавливают некоторые переменные среды, которые могут использоваться CGI или другими директивами в Apache. Он не передает этот сертификат волшебным образом. Вы даже используете некоторые из этих переменных в RequestHeader ... lines.

Если вам действительно нужно проксировать свои запросы в Apache, вам нужно будет обновить свое приложение за прокси, чтобы принимать и доверять заголовкам HTTP, которые вы устанавливаете в Apache, как эквиваленту сертификата.