Una vez que se instala OpenCA y se emite el certificado de CA, al hacer clic en el número de serie del certificado de CA se muestra el siguiente error.
Error Code: 6295020 [initServer:314] Cannot load certificate 404576247583593287078701 from the database.
A pesar de habilitar la opción de depuración, no pude encontrar ningún mensaje de error relevante en stderror.log
.
- La interfaz enumera el certificado de CA, pero no muestra la información del certificado al ejecutar
viewCert or viewCertFull
operaciones cmd. - Verifiqué el CA_Certificate almacenado en la base de datos de PostgreSQL y parece estar bien y VÁLIDO.
- La cadena de consulta en URI parece estar bien con el
dataType
correctamente mencionado a continuación:
cmd=viewCert&dataType=VALID_CA_CERTIFICATE&key=4045762475835932870787014.
- Por lo general, los comandos se ejecutan desde
lib/cmds
está configurado enetc/openca/access_control/*.xml
archivos y todo parece estar configurado correctamente.
Entonces, ¿por qué ocurre este error? Afortunadamente encontré una solución y aquí está.
Cómo solucionar el error:error de OpenCA No se puede cargar el certificado de la base de datos
- La
listCerts
El archivo contiene la subrutinacmdListCerts
que toma la$query
y lo analiza. $dataType
es una de las cosas que extrae.@certsList
se completa con la consulta de la base de datos, que parece funcionar para enumerar elCA_CERTIFICATE
.$type
se completa con$dataType
analizado desde el enlace que llama al script. Entonces, esto debería aparecer como argumento de consulta"dataType"
en el enlace detrás delserial
y al hacer clic en ese enlace, debe enviarse aviewCert
. Allí nuevamente,$dataType
se analiza desde$query
tal como lo fue paralistCerts
, pero de alguna manera esto no funciona correctamente en mi configuración de OpenCA.
Sospeché la forma viewCert
distingue entre CERTIFICATE y
CA_CERTIFICATE y la forma en que se manejan varias consultas de certificados válidos, caducados,
suspendidos y revocados.
Así que aquí hay una modificación al viewCert
cmd en el archivo lib/openca/perl_modules/perl5/OpenCA/AC.pm
Navegue a la subrutina getOwner
donde encontrará lo siguiente:
sub getOwner {
Busque la línea:# load the certificate
Reemplace las siguientes líneas
my @certs; my $certype = "CERTIFICATE"; if( not (@certs = $self->{db}->searchItems ( KEY => $self->{acl}->{object}, DATATYPE => "CERTIFICATE"))) { # if (length ($self->{acl}->{object}) < 60 ) { # @certs = $self->{db}->searchItems (KEY => $self->{acl}->{object}, DATATYPE => "CERTIFICATE"); #} $certtype = "CA_CERTIFICATE"; @certs = $self->{db}->searchItems ( KEY => $self->{acl}->{object}, DATATYPE => "CERTIFICATE"); }
Con:
my @certs; my $certtype = "CERTIFICATE"; if( $self->{db}->searchItems ( KEY => $self->{acl}->{object}, DATATYPE => "CERTIFICATE")) { $certtype = "CA_CERTIFICATE"; @certs = $self->{db}->searchItems ( KEY => $self->{acl}->{object}, DATATYPE => "CERTIFICATE"); } else { $certtype = "CA_CERTIFICATE"; @certs = $self->{db}->searchItems ( KEY => $self->{acl}->{object}, DATATYPE => "CA_CERTIFICATE"); }
El problema estaba en la línea: if( not (@certs = $self->{db}->searchItems (.
)
¡Eso es todo! Espero que ayude a alguien por ahí.