liquidweb/ssl-certificate

一个类,可以轻松查询SSL证书的属性并验证其状态

2.5.6 2022-03-29 17:46 UTC

README

Latest Version on Packagist Software License Build Status Scrutinizer Code Quality Scrutinizer Code Coverage StyleCI Total Downloads

此包受spatie/ssl-certificate原始SSL证书数据验证和查询类的启发,并从中衍生而来。此包与原始类的主要区别在于验证范围和目标。此包在原始类的基础上对SSL证书验证进行了进一步的扩展。

此变体能够检测ssl是否

  • 在浏览器中被信任,
  • 与测试的域名匹配,
  • 在一般意义上有效,
  • 提供附加链,
  • 以及SSL是否被CRL吊销。

此外,此包还跟踪并提供查看SSL链信息的 方法。

以下是一些示例

$certificate = SslCertificate::createForHostName('liquidweb.com'); // Basic SSL test
$certificateWithCrl = SslCertificate::createForHostName('liquidweb.com')->withSslCrlCheck(); // SSL test with CRL checks

$certificate->getIssuer(); // returns "GlobalSign Extended Validation CA - SHA256 - G2"
$certificate->isValid(); // returns true if the certificate is currently valid
$certificate->isTrusted(); // returns true if the certificate is trusted by default
$certificate->hasSslChain(); // returns bool of ssl chain status
$certificate->expirationDate(); // returns an instance of Carbon
$certificate->expirationDate()->diffInDays(); // returns an int
$certificate->getSignatureAlgorithm(); // returns a string
$certificate->getSerialNumber(); // returns a string

// methods that require CRL test
$certificateWithCrl->isRevoked(); // returns bool of revoked status, or null if no list provided
$certificateWithCrl->getCrlRevokedTime(); // returns a Carbon instance of the CRL revocation time
$certificateWithCrl->isValid(); // results may vary from `certificate` if the SSL is CRL revoked
$certificateWithCrl->isTrusted(); // results may vary from `certificate` if the SSL is CRL revoked

安装

您可以通过composer安装此包

composer require liquidweb/ssl-certificate

虽然不是必需的,但强烈建议安装PHP gmp扩展,因为这将有助于加速CRL验证方法。这是因为phpseclib用于处理CRL列表中ASN1序列的解码和比较。

使用

您可以使用以下命名构造函数创建LiquidWeb\SslCertificate\SslCertificate的实例

$certificate = SslCertificate::createForHostName('liquidweb.com');

如果给定的hostName无效,将抛出LiquidWeb\SslCertificate\InvalidUrl

如果给定的hostName有效但下载证书存在问题,将抛出LiquidWeb\SslCertificate\CouldNotDownloadCertificate

获取颁发者名称

$certificate->getIssuer(); // returns "GlobalSign Extended Validation CA - SHA256 - G2"

获取域名

获取域名可以通过两种方式之一完成;您可以使用getDomaingetCertificateDomain。它们非常相似,但在细微之处有所不同。

$certificate->getDomain(); // returns "www.liquidweb.com"

返回用户输入的域名,或证书的主要域名。这种动态的结果风格有助于解决CloudFlare SSL的问题。如果证书的主要域名与输入域名完全不相似,则此方法返回输入域名。

$certificate->getCertificateDomain(); // returns "www.liquidweb.com"

返回证书的主要域名;这将始终且仅返回SSL的主题CN。

获取证书的签名算法

返回用于签名证书的算法

$certificate->getSignatureAlgorithm(); // returns "RSA-SHA256"

获取附加域名

证书可以涵盖多个(子)域名。以下是如何获取它们的方法。

$certificate->getAdditionalDomains(); // returns [
                                                    "www.liquidweb.com",
                                                    "www.stormondemand.com",
                                                    "www.sonet7.com",
                                                    "manage.stormondemand.com",
                                                    "manage.liquidweb.com",
                                                    "liquidweb.com"
                                                ]

此方法返回的域名名称可以以*开头,这意味着它适用于该域的所有子域名。

获取证书生效的日期

$certificate->validFromDate(); // returns an instance of Carbon

获取到期日期

$certificate->expirationDate(); // returns an instance of Carbon

确定证书是否仍然有效

如果SSL对域名有效、默认信任且未过期,则返回true。

如果域名是主要主题或SAN,则SSL对提供的域名有效。信任状态根据SSL的下载方式确定;如果不需要cURL ssl验证,则不受信任。如果当前日期和时间在validFromDateexpirationDate之间,则找到有效的到期状态。

$certificate->isValid(); // returns a boolean

您还可以使用此方法确定给定的域名是否被证书涵盖。当然,它将继续检查当前日期和时间是否在validFromDateexpirationDate之间。

$certificate->isValid('liquidweb.com'); // returns true;
$certificate->isValid('spatie.be'); // returns false;

确定证书直到给定日期是否仍然有效

如果给定日期在证书的有效期内,则返回true。SSL可能因其他原因而无效,这仅仅是再次检查SSL的validFromDateexpirationDate日期。

$certificate->isValidDate(Carbon::create('2017', '03', '30', '12', '00', '00', 'utc')); // returns a boolean

确定证书是否在给定日期之前仍然有效,并确保它是有效的SSL

如果证书有效且expirationDate在给定日期之前,则返回true。

$certificate->isValidUntil(Carbon::now()->addDays(7)); // returns a boolean

确定证书是否已过期

$certificate->isExpired(); // returns a boolean if expired

确定证书是否已被吊销

$certificate = SslCertificate::createForHostName('liquidweb.com')->withSslCrlCheck();
$certificate->isRevoked();

变更日志

请参阅变更日志获取有关最近变更的更多信息。

测试

$ composer test

注意:在测试此库的实现时,可以使用BadSSL模拟各种SSL场景。

致谢

辅助函数和测试是从Laravel框架复制的。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件