カスタム検索
このエントリーをはてなブックマークに追加
tomo.gif (1144 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)To previous pageTo home pageMailing to me

自前の認証局の実験

Modified: 9 October 2007
Created: 30 December 2005

自分で使う場合は、有償のSSL証明書を入手しなくても、自分が認証局の役割をすればいいのでその方法を実験してみました。


認証局の証明書の作成 - 認証局側
サーバー用のキーの作成 - サーバー側
サーバーID(署名されたサーバーの証明書)の作成 - 認証局側
サーバーIDのインストール - サーバー側
ブラウザ用の証明書を作成 - サーバー側
ブラウザ用の証明書のインストール - クライアント側


認証局の証明書の作成

認証局側で行う作業です。有償の証明機関でサーバーIDを購入するときは、この作業は不要です。

以下のディレクトリに移動します。

# cd /usr/share/ssl/misc/
# ll
合計 24
-rwxr-xr-x    1 root     root         3505 10月 12 02:02 CA
-rwxr-xr-x    1 root     root          119 10月 12 02:02 c_hash
-rwxr-xr-x    1 root     root          152 10月 12 02:02 c_info
-rwxr-xr-x    1 root     root          113 10月 12 02:02 c_issuer
-rwxr-xr-x    1 root     root          110 10月 12 02:02 c_name
#

設定ファイル("/usr/share/ssl/openssl.cnf")を、一箇所変更します。

#
# OpenSSL example configuration file.
# This is mostly being used for generation of certificate requests.
#

# This definition stops the following lines choking if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
#oid_file = $ENV::HOME/.oid
oid_section = new_oids

# To use this configuration file with the "-extfile" option of the
# "openssl x509" utility, name here the section containing the
# X.509v3 extensions to use:
# extensions = 
# (Alternatively, use a configuration file that has only
# X.509v3 extensions in its main [= default] section.)

[ new_oids ]

# We can add new OIDs in here for use by 'ca' and 'req'.
# Add a simple OID like this:
# testoid1=1.2.3.4
# Or use config file substitution like this:
# testoid2=${testoid1}.5.6

####################################################################
[ ca ]
default_ca = CA_default # The default ca section

####################################################################
[ CA_default ]

dir = ./demoCA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir/newcerts # default place for new certs.

certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file

x509_extensions = usr_cert # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options

# Extension copying option: use with caution.
# copy_extensions = copy

# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crl_extensions = crl_ext

default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = md5 # which md to use.
preserve = no # keep passed DN ordering

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match

# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

####################################################################
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert

# Passwords for private keys if not present they will be prompted for
# input_password = secret
# output_password = secret

# This sets a mask for permitted string types. There are several options. 
# default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString.
# utf8only: only UTF8Strings.
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
# so use this option with caution!
string_mask = nombstr

# req_extensions = v3_req # The extensions to add to a certificate request

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = GB
countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Berkshire

localityName = Locality Name (eg, city)
localityName_default = Newbury

0.organizationName = Organization Name (eg, company)
0.organizationName_default = My Company Ltd

# we can do this but it is not needed normally :-)
#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 (eg, your name or your server\'s hostname)
commonName_max = 64

emailAddress = Email Address
emailAddress_max = 64

# SET-ex3 = SET extension number 3

[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20

unstructuredName = An optional company name

[ usr_cert ]

# These extensions are added when 'ca' signs a request.

# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.

basicConstraints=CA:FALSE

# Here are some examples of the usage of nsCertType. If it is omitted
# the certificate can be used for anything *except* object signing.

# This is OK for an SSL server.
nsCertType = server

# For an object signing certificate this would be used.
# nsCertType = objsign

# For normal client use this is typical
# nsCertType = client, email

# and for everything including object signing:
# nsCertType = client, email, objsign

# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment

# This will be displayed in Netscape's comment listbox.
nsComment = "OpenSSL Generated Certificate"

# PKIX recommendations harmless if included in all certificates.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always

# This stuff is for subjectAltName and issuerAltname.
# Import the email address.
# subjectAltName=email:copy
# An alternative to produce certificates that aren't
# deprecated according to PKIX.
# subjectAltName=email:move

# Copy subject details
# issuerAltName=issuer:copy

#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]


# Extensions for a typical CA


# PKIX recommendation.

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid:always,issuer:always

# This is what PKIX recommends but some broken software chokes on critical
# extensions.
#basicConstraints = critical,CA:true
# So we do this instead.
basicConstraints = CA:true

# Key usage: this is typical for a CA certificate. However since it will
# prevent it being used as an test self-signed certificate it is best
# left out by default.
# keyUsage = cRLSign, keyCertSign

# Some might want this also
nsCertType = sslCA, emailCA

# Include email address in subject alt name: another PKIX recommendation
# subjectAltName=email:copy
# Copy issuer details
# issuerAltName=issuer:copy

# DER hex encoding of an extension: beware experts only!
# obj=DER:02:03
# Where 'obj' is a standard or added object
# You can even override a supported extension:
# basicConstraints= critical, DER:30:03:01:01:FF

[ crl_ext ]

# CRL extensions.
# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.

# issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always,issuer:always
#

以下のように実行します。

# ./CA -newca
CA certificate filename (or enter to create)<Enter>

Making CA certificate ...
Generating a 1024 bit RSA private key
........++++++
........................++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase: ********
Verifying - Enter PEM pass phrase: ********
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Osaka
Locality Name (eg, city) [Newbury]:Osaka
Organization Name (eg, company) [My Company Ltd]:Goodstream
Organizational Unit Name (eg, section) []:Head
Common Name (eg, your name or your server's hostname) []:cert.tomo.ac
Email Address []:tomoac@yahoo.co.jp
# 

証明書の公開鍵("cacert.pem")と秘密鍵("cakey.pem")を確認します。

# ls demoCA/
cacert.pem  certs  crl  index.txt  newcerts  private  serial
# ls demoCA/private/
cakey.pem
# 

サーバー用のキーの作成

WEBサーバーで使う証明書の作成です。

秘密鍵の作成

# openssl genrsa -des3 -out tomo.ac.key 1024
Generating RSA private key, 1024 bit long modulus
.................................++++++
.........................................++++++
e is 65537 (0x10001)
Enter pass phrase for tomo.ac.key: ********
Verifying - Enter pass phrase for tomo.ac.key: ********
#

サーバーの秘密鍵("tomo.ac.key")ができました。

これをこのまま使うと、Apacheを起動する度にパスワードの入力が求められますので、パスワードを不要にしておきます。もちろん、そのまま使って、毎回パスワードを入力させるほうがセキュリティが高いです。

# openssl rsa -in tomo.ac.key -out tomo.ac.nopass.key 
Enter pass phrase for tomo.ac.key: ********
writing RSA key
#

これで利用時にパスワードのいらないサーバーの秘密鍵("tomo.ac.nopass.key")ができました。


CSRの作成

CSR(Certificate Signing Request)とは、サーバーID(署名されたサーバーの証明書)を得るためのファイルのことで、有償の証明機関で証明してもらうためには、このCSRを送付します。

# openssl req -new -key tomo.ac.key -out csr.pem
Enter pass phrase for tomo.ac.key: ********
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Osaka
Locality Name (eg, city) [Newbury]:Osaka
Organization Name (eg, company) [My Company Ltd]:Goodstream
Organizational Unit Name (eg, section) []:Head
Common Name (eg, your name or your server's hostname) []:www.tomo.ac
Email Address []:tomo@yahoo.co.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<Enter>
An optional company name []:<Enter>
# 

CSR("csr.pem")ができました。


サーバーID(署名されたサーバーの証明書)の作成

認証局側の作業です。

以下のコマンドで、CSRから、サーバーIDを作成します。

# cd /usr/share/ssl/misc/
# openssl ca -in /root/csr.pem -out server.cert
Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Dec 30 04:40:02 2005 GMT
            Not After : Dec 30 04:40:02 2006 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Osaka
            organizationName          = Goodstream
            organizationalUnitName    = Head
            commonName                = www.tomo.ac
            emailAddress              = tomo@yahoo.co.jp
        X509v3 extensions:
            X509v3 Basic Constraints: 
            CA:FALSE
            Netscape Comment: 
            OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
            F1:20:B6:E1:96:53:EF:14:0F:C3:F7:57:59:12:6B:0E:44:24:64:AE
            X509v3 Authority Key Identifier: 
            keyid:D5:27:A3:F2:B2:8D:3E:D9:1D:B0:3A:CD:22:5E:0C:60:D7:AC:33:ED
            DirName:/C=JP/ST=Osaka/L=Osaka/O=Goodstream/OU=Head/CN=www.tomo.ac/emailAddress=tomo@yahoo.co.jp
            serial:00

Certificate is to be certified until Dec 30 04:40:02 2006 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#

サーバーID("server.cert")ができました。

有料の証明機関(べリサイン社など)では、ユーザから送られてきたCSRでこの作業を行い、できたサーバーIDを申込者に返信します。


サーバーIDのインストール

サーバーの秘密鍵("tomo.ac.key")、パスワードのいらないサーバーの秘密鍵("tomo.ac.nopass.key")、そして、CSRから作られたサーバーID("server.cert")の3つをWEBサーバの"/etc/httpd/conf"にコピーします。

そして、"/etc/httpd/conf.d/ssl.conf"を以下のように設定します。

       :

<VirtualHost _default_:443>

       :

DocumentRoot "/var/www/html"
ServerName www.tomo.ac:443

       :

SSLCertificateFile /etc/httpd/conf/server.cert

       :

SSLCertificateKeyFile /etc/httpd/conf/server.nopass.key

       :

SSLCACertificateFile /etc/httpd/conf/cacert.pem

       :

ブラウザ用の証明書を作成

有料の証明機関(べリサイン社など)の証明書は、なにもしなくてもIEに組み込まれていますので、ブラウザに証明書を登録する作業は不要です。しかし、自前の証明書は、自分で登録しないといけません。

以下のコマンドで、証明書をDER形式に変更します。

# openssl x509 -in demoCA/cacert.pem -outform der -out cacert.der

DER形式のクライアント証明書("cacert.der")ができました。


ブラウザ用の証明書のインストール

サーバー側でSSLの設定をしても、ブラウザ側で、証明書の登録をしないと以下のようなメッセージが出ます。

したがって、閲覧者のPCにクライアント証明書("cacert.der")のインストールが必要です。

クライアントのWindowsPCで、"cacert.der"を右クリックすると、「証明書のインストール」というメニューが見えますので、それを選択します。

すると、以下のウイザードが起動しますので、「次へ」をクリックします。

以下のように、「。。。自動的に。。。」のまま「次へ」をクリックします。

最後に、「完了」をクリックします。

以下のメッセージでは、「はい」をクリックします。

以下のメッセージで、「OK」をクリックします。


To previous pageTo home pageMailing to meJump to Top of pageline.gif (927 ツバツイツト)line.gif (927 ツバツイツト)tomo.gif (1144 ツバツイツト)
カスタム検索



このエントリーをはてなブックマークに追加