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 viewCertFull
operace 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
dataType
správně uvedeno níže:
cmd=viewCert&dataType=VALID_CA_CERTIFICATE&key=4045762475835932870787014.
- Obvykle příkazy spouštěné z
lib/cmds
je nakonfigurován vetc/openca/access_control/*.xml
soubory 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
listCerts
soubor obsahuje podprogramcmdListCerts
který přebírá$query
a analyzuje to.$dataType
je jednou z věcí, které extrahuje.@certsList
je vyplněno databázovým dotazem, který zřejmě funguje pro výpisCA_CERTIFICATE
.$type
je vyplněno$dataType
analyzován z odkazu volajícího skript. Toto by se tedy mělo objevit jako argument dotazu"dataType"
v odkazu zaserial
a kliknutím na tento odkaz by měl být odeslán doviewCert
. Zde je opět$dataType
je analyzován z$query
stejně 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.