브라우저가 액세스하려면 일치하는 키를 가져야 하도록 http 트래픽에 대한 SSH 키와 같은 것을 설정할 수 있습니까?
답변1
당신이 찾고 있는 것은상호 SSL 인증.
일반적으로 배포되는 웹 서버의 경우아파치및 일반적으로 배포되는 SSL/TLS 구현OpenSSL,다음과 같이 진행하십시오:
대부분의 작업을 수행 openssl
하는 편리한 스크립트가 함께 배포됩니다 . CA.sh
해당 위치는 배포판별로 다릅니다. 데비안과 그 파생물에서는 다음을 사용하여 찾을 수 있습니다:
# apt-file search CA.sh
openssl: /usr/lib/ssl/misc/CA.sh
RedHat 및 그 파생 제품에 대한 (대략적인) 등가물은 다음과 같습니다.
# yum provides */CA
1:openssl-1.0.1e-4.fc18.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
Repo : @updates
Matched from:
Filename : /etc/pki/tls/misc/CA
이는 CA를 관리하는 데 필요한 디렉터리 구조 생성을 단순화하는 매우 간단한 bash 스크립트입니다( [ CA_default ]
openssl.cnf 섹션에 설명되어 있음). 나는 당신이 그것을 사용하고 그것이 실제로 무엇을 하고 있는지 코드를 살펴보는 것이 좋습니다.
# ./CA.sh -help
usage: ./CA.sh -newcert|-newreq|-newreq-nodes|-newca|-sign|-verify
스크립트는 openssl.cnf에 제공된 기본값을 사용하거나 스위치를 openssl $command
사용하여 구성 파일을 인수로 제공할 수 있습니다(그렇지 않은 경우 파일의 위치 는 배포판별로 다르며 위의 동일한 명령을 사용할 수 있습니다. 찾아오세요) 당신이 원하는 것은 패키지에 제공되는 것입니다.-config
CA.sh
openssl.cnf
openssl
다음 섹션을 수정해야 할 수도 있습니다.
[ CA_default ]
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
[ req ]
default_bits = 2048
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
- CA 생성
openssl.cnf
필요에 맞게 편집한 후 CA 인증서를 생성할 수 있습니다. 이 CA가 인식된 타사 CA의 서명을 받아야 하는지 여부에 따라 자체 서명 CA 또는 CSR을 생성하여 서명을 제출할 수 있습니다.
./CA.sh -newca
몇 가지 질문이 대화식으로 표시되며 대괄호 안에 기본값이 표시됩니다. 여기에서 수정한 옵션을 확인할 수 있습니다 openssl.cnf
.
- 서버용 인증서 생성
동일한 스크립트를 사용하여 서버에 대한 인증서 요청을 생성할 수 있습니다.
./CA.sh -newreq
다시 한 번 몇 가지 질문을 하라는 메시지가 표시됩니다. 그 중 가장 중요한 것은 서버 IP의 DNS 확인 가능 이름과 일치해야 하는 인증서의 일반 이름입니다(또는 /etc/hosts
권장되지 않음, 확인하기 어려운 등의 다른 방법을 사용할 수 있음). 유지 및 확장)
당신이 받게 될 것은 인증서 서명 요청(CSR)입니다. 이는 이전에 생성한 인증 기관(CA)에 의해 서명됩니다.
./CA.sh -sign
- 클라이언트용 인증서 생성
단계를 반복하여 CSR을 생성하고 CA에서 서명하도록 합니다. 이 작업을 수행할 때 일반 이름, 조직 및 조직 단위 필드가 어떻게 채워지는지 세심한 주의를 기울이십시오. 이러한 필드는 나중에 서버를 구성하는 데 필요하기 때문입니다.
각각의 개인 키 및 CA 인증서와 함께 클라이언트 인증서를 배포하는 깔끔한 방법은 p12 번들을 사용하는 것입니다.
openssl pkcs12 -export -in Certificates/client.pem -inkey client.key -certfile CA.pem -out clientcert.p12
- 서버 구성
참조하는 서버가 Apache 웹 서버라고 가정합니다. 서버 인증서를 얻은 후에는 VHOST
상호 SSL 인증으로 보호되는 모든 콘텐츠를 제공하도록 적절한 콘텐츠를 구성할 수 있습니다. 한 가지 예가 phpmyadmin
웹 호스팅입니다. 이는 Apache 2.4 서버에서 실행되므로 그대로 사용하지 마시고 필요에 맞게 다시 확인하고 테스트하시기 바랍니다.
Listen 443 https
<VirtualHost 120.120.120.120:443>
DocumentRoot "/srv/www/html"
ServerAdmin [email protected]
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCertificateFile /etc/pki/tls/private/company.com/newcert.pem
SSLCertificateKeyFile /etc/pki/tls/private/company.com/newkey.pem
SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem
SSLEngine on
SSLStrictSNIVHostCheck on
SSLVerifyClient require
SSLVerifyDepth 5
ServerName phpmyadmin.company.com
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{HTTPS} !=on
RewriteRule . - [F]
ErrorLog "|/usr/sbin/rotatelogs -L /var/log/httpd/foo/error.log -f /var/log/httpd/foo/error.log.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs -L /var/log/httpd/foo/access.log -f /var/log/httpd/foo/access.log.%Y%m%d 86400" logstash_json
<Directory /usr/share/bar/>
Require ssl
Require ssl-verify-client
SSLRequireSSL
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 256
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Awesome Company" \
and %{SSL_CLIENT_S_DN_OU} eq "Development" \
and %{SSL_CLIENT_S_DN_CN} in {"John Doe", "Jane Doe"}
SSLRenegBufferSize 131072
</Directory>
</VirtualHost>
원하는 만큼 디렉터리별 액세스 제어를 사용할 수 있습니다. 표시되는 클라이언트 인증서는 지시어에 의해 부과된 제한 사항을 준수해야 합니다 SSLRequire
. 즉, 조직, 조직 단위 및 일반 이름 조건(또는 기타 조건)과 일치해야 합니다. 적합 인증서 필드가 표시됩니다). 이러한 필드는 클라이언트 인증서에서 가져옵니다.
- 인증서 해지 목록 생성
클라이언트 인증서에 대한 액세스를 취소하려면 CRL을 생성해야 합니다. 이를 수행하는 명령(CA 디렉터리 구조의 최상위에 있는 경우):
openssl ca -config /path/to/openssl.cnf -gencrl -out crl/crl.pem
그런 다음 필요한 경우 다음을 사용하여 클라이언트 인증서를 취소할 수 있습니다.
openssl ca -config /path/to/openssl.cnf -revoke clientcert.pem
인용하다:
답변2
예, "클라이언트 인증서 인증"이라고 하며 스마트 카드 등에 자주 사용됩니다.
원하는 제품에 따라 제대로 작동하는 것이 복잡할 수 있습니다.