HTTP용 SSH 키

HTTP용 SSH 키

브라우저가 액세스하려면 일치하는 키를 가져야 하도록 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사용하여 구성 파일을 인수로 제공할 수 있습니다(그렇지 않은 경우 파일의 위치 는 배포판별로 다르며 위의 동일한 명령을 사용할 수 있습니다. 찾아오세요) 당신이 원하는 것은 패키지에 제공되는 것입니다.-configCA.shopenssl.cnfopenssl

다음 섹션을 수정해야 할 수도 있습니다.

[ 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

인용하다:

OpenSSL온라인 문서 및아파치온라인 문서.

답변2

예, "클라이언트 인증서 인증"이라고 하며 스마트 카드 등에 자주 사용됩니다.

원하는 제품에 따라 제대로 작동하는 것이 복잡할 수 있습니다.

관련 정보