Eu fiz um monte de pesquisas, mas não consegui encontrar uma resposta. Estou postando isso aqui porque parece mais um problema do OpenSSL do que do PHP, embora eu possa usar essa configuração da CA para criar certs a partir da linha de comando, então há algo que o PHP não gosta nela.
Ao chamar openssl_pkey_new()
no PHP, estou recebendo o erro:
Error loading request_extensions_section section v3_req of /path/to/ca.config
.
Estou passando o caminho do arquivo ca.config para openssl_pkey_new()
através do array de configuração, e o PHP está abrindo o arquivo.
O arquivo ca.config se parece com:
[ ca ]
default_ca = MyClientCA
[ crl_ext ]
issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always
[ MyClientCA ]
dir = /site/path/ssl/ca
new_certs_dir = $dir
unique_subject = no
certificate = $dir/MyClientCA.public
database = $dir/certindex
private_key = $dir/MyClientCA.key
serial = $dir/MyClientCA.srl
default_days = 3650
default_md = sha1
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = $dir/crlnumber
default_crl_days = 730
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional
[ myca_extensions ]
basicConstraints = critical,CA:TRUE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_section
subjectAltName = @alt_names
authorityInfoAccess = @ocsp_section
[ v3_ca ]
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_section
subjectAltName = @alt_names
authorityInfoAccess = @ocsp_section
[alt_names]
DNS.0 = Sparkling Intermidiate CA 1
DNS.1 = Sparkling CA Intermidiate 1
[crl_section]
URI.0 = http://pki.sparklingca.com/SparklingRoot.crl
URI.1 = http://pki.backup.com/SparklingRoot.crl
[ocsp_section]
caIssuers;URI.0 = http://pki.sparklingca.com/SparklingRoot.crt
caIssuers;URI.1 = http://pki.backup.com/SparklingRoot.crt
OCSP;URI.0 = http://pki.sparklingca.com/ocsp/
OCSP;URI.1 = http://pki.backup.com/ocsp/
Infelizmente, o erro error loading request_extensions_section section v3_req
não é muito útil.
Eu não tenho uma seção request_extensions
no arquivo. Há uma diretiva x509_extensions
que aponta para myca_extensions
, mas isso não parece ter nada de errado com isso.
Também não há uma seção v3_req
. Há uma seção v3_ca
, mas, novamente, não vejo nada de errado com isso.
Como posso obter mais detalhes sobre o que há de errado com o arquivo de configuração?
Atualizar
Eu tentei um monte de coisas.
Eu tentei copiar o arquivo do arquivo openssl.conf padrão do sistema, mas isso apenas altera o erro para:
error:0E06D06C:configuration file routines:NCONF_get_string:no value
Há muitas pessoas on-line perguntando sobre esse erro, mas nenhuma delas tem respostas úteis.
Eu mudei para uma configuração básica:
[ ca ]
default_ca = ClientCA
[ ClientCA ]
dir = /path/var/ssl
new_certs_dir = $dir/pk12
unique_subject = no
certificate = $dir/ca/ClientCA.public
database = $dir/ca/certindex
private_key = $dir/ca/ClientCA.key
serial = $dir/ca/ClientCA.srl
default_days = 3650
default_md = sha256
policy = myca_policy
x509_extensions = myca_extensions
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional
[ myca_extensions ]
basicConstraints = CA:FALSE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_section
subjectAltName = @alt_names
authorityInfoAccess = @ocsp_section
Mas o mesmo erro:
error:0E06D06C:configuration file routines:NCONF_get_string:no value
A configuração funciona bem criando certs a partir da linha de comando.