Jakmile je OpenCA nainstalována a certifikát CA je vydán, kliknutím na sériové číslo certifikátu CA vyvoláte níže uvedenou chybu.
Error Code: 6295020 [initServer:314] Cannot load certificate 404576247583593287078701 from the database.
Navzdory povolení možnosti ladění jsem v stderror.log nenašel žádné relevantní chybové zprávy .
- Rozhraní uvádí certifikát CA, ale nezobrazuje informace o certifikátu při provádění
viewCert or viewCertFulloperace cmd. - Ověřil jsem CA_Certificate uložený v databázi PostgreSQL a zdá se, že je v pořádku a PLATNÝ.
- Řetězec dotazu v URI se zdá být v pořádku s
dataTypesprávně uvedeno níže:
cmd=viewCert&dataType=VALID_CA_CERTIFICATE&key=4045762475835932870787014.
- Obvykle příkazy spouštěné z
lib/cmdsje nakonfigurován vetc/openca/access_control/*.xmlsoubory a vše se zdá být správně nakonfigurováno.
Proč tedy k této chybě dochází? Naštěstí jsme našli řešení a tady je.
Jak opravit chybu – chyba OpenCA Nelze načíst certifikát z databáze
listCertssoubor obsahuje podprogramcmdListCertskterý přebírá$querya analyzuje to.$dataTypeje jednou z věcí, které extrahuje.@certsListje vyplněno databázovým dotazem, který zřejmě funguje pro výpisCA_CERTIFICATE.$typeje vyplněno$dataTypeanalyzován z odkazu volajícího skript. Toto by se tedy mělo objevit jako argument dotazu"dataType"v odkazu zaseriala kliknutím na tento odkaz by měl být odeslán doviewCert. Zde je opět$dataTypeje analyzován z$querystejně jako ulistCerts, ale nějak to nefunguje správně v mém nastavení OpenCA.
Měl jsem podezření na způsob viewCert rozlišuje mezi CERTIFICATE a
CA_CERTIFICATE a způsobem, jakým jsou zpracovávány různé dotazy na platné, expirované,
pozastavené a zrušené certifikáty.
Zde je tedy úprava viewCert cmd v souboru lib/openca/perl_modules/perl5/OpenCA/AC.pm
Přejděte do podprogramu getOwner kde najdete následující:
sub getOwner {
Najděte řádek:# load the certificate
Nahraďte níže uvedené řádky
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");
} S:
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");
}
Problém byl s řádkem: if( not (@certs = $self->{db}->searchItems (.)
A je to! Doufám, že to někomu pomůže.