Я хотел бы ограничить SSL-доступ к экземпляру Tomcat с помощью сертификатов, а не полагаться на какие-либо «пользовательские» учетные записи.
У меня есть ЦС, который используется для подписи сертификатов, но если я настрою Tomcat на доверие ЦС, он будет доверять кто угодно подписанный им, в то время как я хотел бы быть гораздо более ограничительным и разрешать только сертификаты, для которых я одобрил это конкретное использование (а именно, для приложений, которые я запускаю на этом сервере).
Мне кажется, что это именно то, для чего предназначена часть расширенного использования ключей X.509, и я могу создавать сертификаты с этим полем, определенным для настраиваемого значения, но я не могу понять, есть ли способ сделать Tomcat обратите внимание на это поле и разрешите только определенные использования. Кто-нибудь знает как это сделать? Даже указатели для Apache httpd были бы полезны, поскольку в крайнем случае я мог бы поставить Tomcat за интерфейсом https.
Конкретный материал для Apache, так как мне намного удобнее работать с ним, чем с Tomcat напрямую -
Использование сертификата не отображается в список переменных среды SSL которые Apache делает доступными по умолчанию. Но это выглядит как вы можете использовать обычай SSLRequire
как это:
SSLRequire "certUsageSSLClient" in PeerExtList("SECCertUsages")
я верить эти имена верны, но вам, возможно, придется вникнуть в их OID, если короткие имена не совсем то, что ожидает ваша реализация ssl.
http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html
Это невозможно сделать на уровне SSL в tomcat с расширеннымKeyUsage. mod_ssl (из APR) позволяет делать это только с помощью SSLRequire, но, поскольку это недопустимо в области сервера, оно будет проигнорировано. Я не думаю, что реализация, отличная от APR, тоже поддерживает это, поскольку я не видел никаких доказательств этого.
В лучшем случае вы можете сами посмотреть сертификат в своем сервлете (при условии, что он предоставляет его вам; я не уверен, как это сделать) и проверить там расширение.
Однако то, что вы пытаетесь сделать, нетипично. Обычный способ сделать это - создать свой собственный корень доверия (не доверять корню доверия браузера или чему-либо еще) и использовать его для выдачи клиентских сертификатов. Это должен быть сертификат клиента (с clientAuth, а если v3, соответствующие EKU для этого), но ничего особенного не должно быть. У вас есть основания полагаться на DN для идентификации пользователя.