【发布时间】:2019-06-23 10:12:44
【问题描述】:
我找到了一个用于检索 CA 证书的编码。问题是脚本是.sh格式的:
wget -O - https://eidas.agid.gov.it/TL/TSL-IT.xml | perl -ne 'if (/<X509Certificate>/) {
s/^\s+//; s/\s+$//;
s/<\/*X509Certificate>//g;
print "-----BEGIN CERTIFICATE-----\n";
while (length($_)>64) {
print substr($_,0,64)."\n";
$_=substr($_,64);
}
print $_."\n";
print "-----END CERTIFICATE-----\n";
}' >CA.pem
我想在 PHP 上使用它,但我不知道它在 .sh 中是如何工作的(我使用 windows,我无法在 .sh 中查看输出)所以我不知道如何开始转换:(
更新:经过一番尝试,我已经到了这一点:
$xmlDoc = simplexml_load_file('https://eidas.agid.gov.it/TL/TSL-IT.xml');
$content = "";
foreach ($xmlDoc->SchemeInformation->PointersToOtherTSL->OtherTSLPointer->ServiceDigitalIdentities->ServiceDigitalIdentity as $key)
{
$content .= "-----BEGIN CERTIFICATE-----" . PHP_EOL;
$content .= wordwrap($key->DigitalId->X509Certificate, 64, PHP_EOL, true);
$content .= PHP_EOL;
$content .= "-----END CERTIFICATE-----" . PHP_EOL;
}
file_put_contents("test.txt",$content);
问题是“X509Certificate”在 XML 中的其他块中,所以我必须为每个块创建一个循环。有没有办法仅通过元素名称 =“X509Certificate”提取值而不知道正确的树 gerarchy?
【问题讨论】:
-
您发布的不是问题,而是请人做您的工作。尝试perldoc.perl.org/index-language.html 并从那里开始。
-
为什么不正确地使用 XML 解析器呢?
curl --silent https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_signed.xml | perl -MXML::LibXML -e '@nodes=XML::LibXML->load_xml(IO => \*STDIN)->getElementsByTagName("X509Certificate"); print "-----BEGIN CERTIFICATE-----\n", join("\n", $nodes[0]->textContent =~ /(.{0,64})/g), "-----END CERTIFICATE-----\n";' -
我已经更新了部分解决方案。但我不知道如何简化它。如果有一种方法可以通过它的名称只检索一个元素。顺便说一句,正确的网址是:eidas.agid.gov.it/TL/TSL-IT.xml
-
@StefanBecker 嗨,我想使用纯 PHP,因为脚本可以在 windows 或 linux 系统上运行。所以 perl 无法在无法安装 3 方软件的托管 Windows 服务器中执行