Крутится на Linux. Если точнее - на Ubuntu 8.04 LTS.
Итак, вот как это сделано у меня. Вся информация собиралась по инету, часть скриптов корректировалась, часть писалась заново. Что откуда - не помню, так что не обессудьте - ссылок на первоисточники не даю.
Сам сервер сертификации работает на web-сервере компании. Это может быть, и не совсем правильно с точки зрения безопасности, но для меня это вполне достаточно и удобно. Тем более, что доступ к серверу только по ssl с авторизацией пользователей по ldap (у меня вся авторизация на ldap).
Еще одно замечание. web-сервер расположен в DMZ, LDAP-сервер внутри "зеленой" зоны, так что в файрволле прописано правило доступа из web-сервера (ca.company.ru) к внутреннему LDAP-серверу (10.0.0.3) по порту 389.
1. Директория web-сервера /var/www/ca , создаем в ней .htaccess для того, чтобы доступ к серверу был только по ssl:
DirectoryIndex index.html
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "ca.company.ru"
ErrorDocument 403
https://ca.company.ru2. Создаем index.html (как пример привожу свой):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE> ca.company.ru - company Certificate Authority</TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="300">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</HEAD>
<BODY BGCOLOR="#ffffff" text="#000000" link="#000000" vlink="#000000"
alink="#000000">
<CENTER>
<p><b>This is the Certificate Authority of <a href="
http://www.company.ru">company Ltd.</a></b></p>
<p><a href="/ca.crt">company CA Certificate (da ed 1a 17 e3 5b 66 36 89 05 7c 94 e8 d9 92 37 ab 6c e1 d1)</a><br>
(Please install it if you are going to trust Certificates signed by company CA)<br><br>
<a href="/crl.crl">CA Certificate Revocation List</a><br>
(Please download the list of revoked certificates signed by company CA)<br>
</p>
<p><a href="/internal">Working with your Certificates</a><br>
(Authorized logins for company staff only)<br>
</p>
</CENTER>
</BODY>
</HTML>
3. Создаем нужную структуру директорий:
cd /var/www/ca
mkdir internal
mkdir internal/CA_clean
cd internal/CA_clean
Здесь создаем скрипт для работы с ключами пользователей index.php:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE> ca.company.ru - company Certificate Authority</TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="300">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</HEAD>
<BODY BGCOLOR="#ffffff" text="#000000" link="#000000" vlink="#000000"
alink="#000000">
<CENTER>
<p><b><a href="/">Certificate Authority</a> of <a href="
http://www.company.ru">company Ltd.</a></b></p>
</center>
<p><b>Запрос нового ключа</b></p>
<form method=post action=CA_clean/newcert.php>
Ваш e-mail : <input type="text" name="email" value="" size="50"><br>
Пароль для ключа: <input type="password" name="password" value="" size="50"><br>
Повторите пароль: <input type="password" name="password1" value="" size="50"><br>
<input type="submit" value="Request" class="control">
</form>
<p><b>Отзыв существующего ключа</b></p>
<form method=post action=CA_clean/revokecert.php>
Ваш e-mail : <input type="text" name="email" value="" size="50"><br>
Пароль для ключа: <input type="password" name="password" value="" size="50"><br>
<input type="submit" value="Revoke" class="control">
</form>
<p><b>Получение ранее выданного ключа</b></p>
<form method=post action=CA_clean/getcert.php>
Ваш e-mail : <input type="text" name="email" value="" size="50"><br>
Пароль для ключа: <input type="password" name="password" value="" size="50"><br>
<input type="submit" value="Get" class="control">
</form>
<p><b>Список всех выданных сертификатов для импорта</b></p>
<form method=post action=CA_clean/listcert.php>
<input type="submit" value="List" class="control">
</form>
<BODY>
</HTML>
и .htaccess:
AuthType Basic
AuthBasicProvider ldap
AuthName "Login with your company login"
AuthLdapURL "ldap://10.0.0.3:389/ou=Users,dc=company,dc=ru"
require valid-user
cd CA_clean
mkdir ca.db.certs
mkdir SERVERS
mkdir SERVERS/internal
Первая директория - хранилище выданных ключей. Вторая - для ключей серверов. Третья - для пользовательских ключей.
4. Создаем конфигурационный файл для выдаваемых сертификатов ca.conf (нужное поменять на свои значения):
[req]
distinguished_name =req_distinguished_name
x509_extensions = v3_ca
prompt = no
[req_distinguished_name]
C= RU
ST = Moscow
L = Moscow region
O = company Ltd.
OU = ROOTCA
CN = ca.company.ru
emailAddress = admin@company.ru
[v3_ca]
basicConstraints = CA:true
nsComment = "CA certificate of company Ltd."
nsCertType = sslCA, emailCA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
[ usr_cert ]
nsComment = "Certificate issued by
http://ca.company.ru/"
nsBaseUrl =
http://ca.company.ru/nsRevocationUrl =
http://ca.company.ru/crl.crlissuerAltName = URI:http://ca.company.ru/ca.crt
crlDistributionPoints = URI:http://ca.company.ru/crl.crl
5. Скрипты для выдачи и отзыва ключей (далее PASSWORD - пароль, который Вы выбрали для подписывания всех ключей):
Создание CA (certificate authority) createca.sh:
#!/bin/sh
#From NIST
#The recommended key length for data which should be available > 2016
#is 2048 (RSA)
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -nodes -sha1 -days 3650 -key ca.key -out ca.crt -config ca.conf
openssl x509 -trustout -inform PEM -in ca.crt -outform DER -out ca.pfx
Создание ключей сервера createserver.sh:
#!/bin/sh
if [ $# -ne 1 ] ; then
echo "specify the server directory!"
exit 1;
fi
if [ ! -d $1 ] ; then
echo "$1 is not a directory"
exit 1;
fi
openssl genrsa -passout pass:PASSWORD -des3 -out $1/server.key.1 2048
openssl rsa -passin pass:PASSWORD -in $1/server.key.1 -out $1/server.key
openssl req -config $1/openssl.conf -new -key $1/server.key -out $1/server.csr
rm -f $1/server.key.1
./sign1.sh $1/server.csr
Создание клиентских ключей createclient.sh:
#!/bin/sh
if [ $# -ne 1 ] ; then
echo "specify the client directory!"
exit 1;
fi
if [ ! -d $1 ] ; then
echo "$1 is not a directory"
exit 1;
fi
openssl req -config $1/openssl.conf -new -newkey rsa:2048 -nodes -out $1/client.csr -keyout $1/client.key
./signclient.sh $1/client.csr
openssl pkcs12 -export -clcerts -in $1/client.crt -inkey $1/client.key -certfile ca.crt -out $1/client.p12 -name "company Client Certificate" -passout file:$1/pass
Скрипт подписывания ключей сервера sign1.sh:
#!/bin/sh
##
## sign.sh -- Sign a SSL Certificate Request (CSR)
## Copyright (c) 1998-2001 Ralf S. Engelschall, All Rights Reserved.
##
# argument line handling
CSR=$1
if [ $# -ne 1 ]; then
echo "Usage: sign.sign <whatever>.csr"; exit 1
fi
if [ ! -f $CSR ]; then
echo "CSR not found: $CSR"; exit 1
fi
case $CSR in
*.csr ) CERT="`echo $CSR | sed -e 's/.csr/.crt/'`" ;;
* ) CERT="$CSR.crt" ;;
esac
# make sure environment exists
if [ ! -d ca.db.certs ]; then
mkdir ca.db.certs
fi
if [ ! -f ca.db.serial ]; then
echo '01' >ca.db.serial
fi
if [ ! -f ca.db.index ]; then
cp /dev/null ca.db.index
fi
# create an own SSLeay config
cat >ca.config <<EOT
[ ca ]
default_ca = CA_own
[ CA_own ]
dir = .
certs = $dir
new_certs_dir = $dir/ca.db.certs
database = $dir/ca.db.index
serial = $dir/ca.db.serial
RANDFILE = $dir/ca.db.rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 1825
default_crl_days = 1
default_md = sha1
preserve = no
policy = policy_anything
x509_extensions = usr_cert
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[usr_cert]
basicConstraints = CA:false
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
EOT
# sign the certificate
echo "CA signing: $CSR -> $CERT:"
openssl ca -batch -config ca.config -out $CERT -infiles $CSR
echo "CA verifying: $CERT <-> CA cert"
openssl verify -CAfile ca.crt $CERT
# cleanup after SSLeay
rm -f ca.config
rm -f ca.db.serial.old
rm -rf ca.db.index.old
# die gracefully
exit 0
Скрипт подписывания ключей клиента signclient.sh:
#!/bin/sh
##
## sign.sh -- Sign a SSL Certificate Request (CSR)
## Copyright (c) 1998-2001 Ralf S. Engelschall, All Rights Reserved.
##
# argument line handling
CSR=$1
if [ $# -ne 1 ]; then
echo "Usage: sign.sign <whatever>.csr"; exit 1
fi
if [ ! -f $CSR ]; then
echo "CSR not found: $CSR"; exit 1
fi
case $CSR in
*.csr ) CERT="`echo $CSR | sed -e 's/.csr/.crt/'`" ;;
* ) CERT="$CSR.crt" ;;
esac
# make sure environment exists
if [ ! -d ca.db.certs ]; then
mkdir ca.db.certs
fi
if [ ! -f ca.db.serial ]; then
echo '01' >ca.db.serial
fi
if [ ! -f ca.db.index ]; then
cp /dev/null ca.db.index
fi
# create an own SSLeay config
cat >ca.config <<EOT
[ ca ]
default_ca = CA_own
[ CA_own ]
dir = .
certs = $dir
new_certs_dir = $dir/ca.db.certs
database = $dir/ca.db.index
serial = $dir/ca.db.serial
RANDFILE = $dir/ca.db.rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 1825
default_crl_days = 1
default_md = sha1
preserve = no
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
EOT
# sign the certificate
echo "CA signing: $CSR -> $CERT:"
openssl ca -batch -config ca.config -passin pass:PASSWORD -out $CERT -infiles $CSR
echo "CA verifying: $CERT <-> CA cert"
openssl verify -CAfile ca.crt $CERT
# cleanup after SSLeay
rm -f ca.config
rm -f ca.db.serial.old
rm -f ca.db.index.old
# die gracefully
exit 0
Упаковка ключей сервера для передачи на сервер bundleserver.sh:
#!/bin/sh
if [ $# -ne 1 ] ; then
echo "specify the server directory!"
exit 1;
fi
if [ ! -d $1 ] ; then
echo "$1 is not a directory"
exit 1;
fi
tar -czf $1/deploy.tar.gz $1/server.crt $1/server.key ca.crt crl.pem
Упаковка ключей клиента bundleclient.sh:
#!/bin/sh
#!/bin/sh
if [ $# -ne 1 ] ; then
echo "specify the server directory!"
exit 1;
fi
if [ ! -d $1 ] ; then
echo "$1 is not a directory"
exit 1;
fi
tar -czf $1/deploy.tar.gz $1/client.p12 ca.crt crl.pem
Конфигурационный файл для отзыва ключей carevoke.config:
[ ca ]
default_ca = CA_own
[ CA_own ]
dir = .
certs = .
new_certs_dir = ./ca.db.certs
database = ./ca.db.index
serial = ./ca.db.serial
RANDFILE = ./ca.db.rand
certificate = ./ca.crt
private_key = ./ca.key
default_days = 1095
default_crl_days = 1
default_md = sha1
preserve = no
nsComment = "Certificate issued by
http://ca.company.ru/"
nsBaseUrl =
http://ca.company.ru/nsRevocationUrl =
http://ca.company.ru/crl.crlissuerAltName = URI:http://ca.company.ru/ca.crt
crlDistributionPoints = URI:http://ca.company.ru/crl.crl
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
Скрипт отзыва ключей revoke.sh:
#!/bin/sh
openssl ca -revoke $1 -config carevoke.config -passin pass:PASSWORD
./createcrl.sh
Скрипт создания списка отозванных ключей createcrl.sh:
#!/bin/sh
cd /var/www/ca/internal/CA_clean
openssl ca -gencrl -out crl.pem -config carevoke.config -passin pass:PASSWORD
openssl crl -in crl.pem -outform DER -out crl.crl
Скрипт для web - создание ключа пользователя newcert.php:
<?php
$password=$_POST["password"];
$password1=$_POST["password1"];
$email=strtolower($_POST["email"]);
$prefix="SERVERS/internal/";
$opensslconf="[ req ]\n
default_bits = 2048\n
distinguished_name = req_distinguished_name\n
prompt = no\n
req_extensions = v3_req\n
[ req_distinguished_name ]\n
C = RU\n
ST = Moscow\n
L = Moscow region\n
O = company Ltd.\n
CN = ";
$opensslconf1="\n
emailAddress = ";
$download="<a href=\"".$prefix.$email."/client.p12"."\">Ваш сертификат с ключом p12 (для почты)</a><br><a href=\"".$prefix.$email."/client.crt"."\">Ваш сертификат .cer (для доступа к локальной сети)</a><br><a href=\"".$prefix.$email."/client.key"."\">Ваш личный ключ (держите в секрете!)</a>";
$opensslconf2="\n
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier = hash\n";
$filename=$prefix.$email;
$execstr="/var/www/ca/internal/CA_clean/createclient.sh SERVERS/internal/".$email;
$execstr1="/var/www/ca/internal/CA_clean/createclient.sh SERVERS/internal/".$email;
if($password<>$password1) {
print <<<WRONGPASS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Пароли не совпадают - попробуйте еще раз.
</body></html>
WRONGPASS;
exit(1);
}
if($password=="") {
print <<<EMPTYPASS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Пароль не может быть пустым - попробуйте еще раз.
</body></html>
EMPTYPASS;
exit(1);
}
if(file_exists($filename)) {
print <<<EXISTS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Вы уже запрашивали ключ. Вам нужно сначала отозвать предыдущий ключ.
</body></html>
EXISTS;
exit(1);
}
mkdir($filename);
$filename=$prefix.$email."/pass";
$file=fopen($filename,"w");
fwrite($file,$password);
fclose($file);
$filename=$prefix.$email."/openssl.conf";
$file=fopen($filename,"w");
fwrite($file,$opensslconf);
fwrite($file,$email);
fwrite($file,$opensslconf1);
fwrite($file,$email);
fwrite($file,$opensslconf2);
fclose($file);
exec($execstr);
print <<<END
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
END;
print $download;
print <<<END1
</body></html>
END1;
?>
Скрипт для web - запрос выданного ранее ключа getcert.php:
<?php
$password=$_POST["password"];
$email=strtolower($_POST["email"]);
$prefix="SERVERS/internal/";
$opensslconf="[ req ]\n
default_bits = 2048\n
distinguished_name = req_distinguished_name\n
prompt = no\n
req_extensions = v3_req\n
[ req_distinguished_name ]\n
C = RU\n
ST = Moscow\n
L = Moscow region\n
O = company Ltd.\n
OU = Administration\n
CN = ";
$opensslconf1="\n
emailAddress = ";
$download="<a href=\"".$prefix.$email."/client.p12"."\">Ваш сертификат с ключом p12 (для почты)</a><br><a href=\"".$prefix.$email."/client.crt"."\">Ваш сертификат .cer (для доступа к локальной сети)</a><br><a href=\"".$prefix.$email."/client.key"."\">Ваш личный ключ (держите в секрете!)</a>";
$opensslconf2="\n
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier = hash\n";
$filename=$prefix.$email;
$execstr="/var/www/ca/internal/CA_clean/revoke.sh SERVERS/internal/".$email."/client.crt";
if($password=="") {
print <<<EMPTYPASS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Пароль не может быть пустым - попробуйте еще раз.
</body></html>
EMPTYPASS;
exit(1);
}
if(!file_exists($filename) || ($email=="")) {
print <<<EXISTS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Ваш ключ не найден...
</body></html>
EXISTS;
exit(1);
}
$filename=$prefix.$email."/pass";
$file=fopen($filename,"r");
$password1=fread($file,filesize($filename));
fclose($file);
if($password<>$password1) {
print <<<WRONGPASS1
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Пароль неверен - попробуйте еще раз.
</body></html>
WRONGPASS1;
exit(1);
}
print <<<END2
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
END2;
print $download;
print <<<END1
</body></html>
END1;
exit(0);
Скрипт для web - отзыв ключа revokecert.php:
<?php
$password=$_POST["password"];
$email=strtolower($_POST["email"]);
$prefix="SERVERS/internal/";
$opensslconf="[ req ]\n
default_bits = 2048\n
distinguished_name = req_distinguished_name\n
prompt = no\n
req_extensions = v3_req\n
[ req_distinguished_name ]\n
C = RU\n
ST = Moscow\n
L = Moscow region\n
O = company Ltd.\n
OU = Administration\n
CN = ";
$opensslconf1="\n
emailAddress = ";
$download="<a href=\"".$prefix.$email."/client.p12"."\">Download your key here!</a>";
$opensslconf2="\n
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier = hash\n";
$filename=$prefix.$email;
$execstr="/var/www/ca/internal/CA_clean/revoke.sh SERVERS/internal/".$email."/client.crt";
if($password=="") {
print <<<EMPTYPASS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Пароль не может быть пустым - попробуйте еще раз.
</body></html>
EMPTYPASS;
exit(1);
}
if((!file_exists($filename)) || ($email=="")) {
print <<<EXISTS
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Ваш ключ не найден - нечего отзывать...
</body></html>
EXISTS;
exit(1);
}
$filename=$prefix.$email."/pass";
$file=fopen($filename,"r");
$password1=fread($file,filesize($filename));
fclose($file);
if($password<>$password1) {
print <<<WRONGPASS1
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Пароль неверен - попробуйте еще раз.
</body></html>
WRONGPASS1;
exit(1);
}
exec($execstr);
$filename=$prefix.$email;
rm($filename);
print <<<END1
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Ваш ключ отозван.
</body></html>
END1;
exit(0);
function rm($fileglob)
{
if (is_string($fileglob)) {
if (is_file($fileglob)) {
return unlink($fileglob);
} else if (is_dir($fileglob)) {
$ok = rm("$fileglob/*");
if (! $ok) {
return false;
}
return rmdir($fileglob);
} else {
$matching = glob($fileglob);
if ($matching === false) {
trigger_error(sprintf('No files match supplied glob %s', $fileglob), E_USER_WARNING);
return false;
}
$rcs = array_map('rm', $matching);
if (in_array(false, $rcs)) {
return false;
}
}
} else if (is_array($fileglob)) {
$rcs = array_map('rm', $fileglob);
if (in_array(false, $rcs)) {
return false;
}
} else {
trigger_error('Param #1 must be filename or glob pattern, or array of filenames or glob patterns', E_USER_ERROR);
return false;
}
return true;
}
?>
Скрипт для web - список выданных ключей listcert.php:
<?php
$prefix="SERVERS/internal/";
$opensslconf="[ req ]\n
default_bits = 2048\n
distinguished_name = req_distinguished_name\n
prompt = no\n
req_extensions = v3_req\n
[ req_distinguished_name ]\n
C = RU\n
ST = Moscow\n
L = Moscow region\n
O = company Ltd.\n
OU = Administration\n
CN = ";
$opensslconf1="\n
emailAddress = ";
$download="<a href=\"".$prefix.$email."/client.p12"."\">Download your key here!</a>";
$opensslconf2="\n
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier = hash\n";
$filename=$prefix;
print <<<END1
<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"></head><body>
Список доступных сертификатов для импорта:<br /><br />
END1;
foreach (ListFiles($filename) as $key=>$file){
list($garbage,$target)=split("//",$file);
list($name1,$name2)=split("/",$target);
$parts=pathinfo($name2);
if($parts['extension']=="crt") {
$filefrom=$prefix.$name1."/client.crt";
$fileto=$prefix.$name1."/".$name1.".cer";
copy($filefrom,$fileto);
print "<a href='" . $fileto . "'>".$name1. "</a><br />";
}
}
print <<<END2
</body></html>
END2;
exit(0);
function ListFiles($dir) {
if($dh = opendir($dir)) {
$files = Array();
$inner_files = Array();
while($file = readdir($dh)) {
if($file != "." && $file != ".." && $file[0] != '.') {
if(is_dir($dir . "/" . $file)) {
$inner_files = ListFiles($dir . "/" . $file);
if(is_array($inner_files)) $files = array_merge($files, $inner_files);
} else {
array_push($files, $dir . "/" . $file);
}
}
}
closedir($dh);
return $files;
}
}
foreach (ListFiles('/home/ibbo') as $key=>$file){
print $file ."<br />";
}
?>
Если я правильно помню, для создания клиентских ключей больше ничего не нужно (естественно, что директории должны быть доступны по записи web-серверу).
Для создания серверных ключей (если нужно):
1. Создаем папку с именем сервера в директории SERVERS , например
mkdir SERVERS/www.company.ru
и записываем туда файл конфигурации openssl.conf:
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
prompt = no
req_extensions = v3_req
[ req_distinguished_name ]
C = RU
ST = Moscow
L = Moscow region
O = company Ltd.
CN = cms.company.ru
emailAddress = admin@company.ru
[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
после чего запускаем скрипты создания ключа сервера и упаковки ключей:
cd /var/www/ca/CA_clean
./createserver.sh
www.company.ru./bundleserver.sh
www.company.ruДа, еще. Для ежедневного формирования списка отозванных ключей у меня в cron запусукается следующее:
1 0 * * * /var/www/ca/internal/CA_clean/createcrl.sh &>/dev/null
2 0 * * * cp /var/www/ca/internal/CA_clean/crl.crl /var/www/ca/crl.crl &> /dev/null
Вроде все... Ну и, еще раз: все делалось для себя, поэтому не все правильно, оптимально и вылизано.
Но - у меня работает. Если что непонятно - будем разбираться вместе.