⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285838 in webkit


Ignore:
Timestamp:
Nov 15, 2021, 2:44:13 PM (5 years ago)
Author:
Takashi.Komori@sony.com
Message:

[Curl] Security information sometimes do not appear in inspector network tab
https://bugs.webkit.org/show_bug.cgi?id=232971

Reviewed by Fujii Hironori.

Get certificate information from SSL context when CurlSSLVerifier is empty.

No tests yet.

  • platform/network/curl/CertificateInfo.h:
  • platform/network/curl/CurlContext.cpp:

(WebCore:: const):
(WebCore::CurlHandle::addExtraNetworkLoadMetrics):
(WebCore::CurlHandle::certificateInfo const):

  • platform/network/curl/CurlContext.h:
  • platform/network/curl/OpenSSLHelper.cpp:

(OpenSSL::StackOfX509::StackOfX509):
(OpenSSL::StackOfX509::~StackOfX509):
(OpenSSL::pemDataFromCtx):
(OpenSSL::createCertificateInfo):

  • platform/network/curl/OpenSSLHelper.h:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r285837 r285838  
     12021-11-15  Takashi Komori  <Takashi.Komori@sony.com>
     2
     3        [Curl] Security information sometimes do not appear in inspector network tab
     4        https://bugs.webkit.org/show_bug.cgi?id=232971
     5
     6        Reviewed by Fujii Hironori.
     7
     8        Get certificate information from SSL context when CurlSSLVerifier is empty.
     9
     10        No tests yet.
     11
     12        * platform/network/curl/CertificateInfo.h:
     13        * platform/network/curl/CurlContext.cpp:
     14        (WebCore:: const):
     15        (WebCore::CurlHandle::addExtraNetworkLoadMetrics):
     16        (WebCore::CurlHandle::certificateInfo const):
     17        * platform/network/curl/CurlContext.h:
     18        * platform/network/curl/OpenSSLHelper.cpp:
     19        (OpenSSL::StackOfX509::StackOfX509):
     20        (OpenSSL::StackOfX509::~StackOfX509):
     21        (OpenSSL::pemDataFromCtx):
     22        (OpenSSL::createCertificateInfo):
     23        * platform/network/curl/OpenSSLHelper.h:
     24
    1252021-11-15  Kiet Ho  <tho22@apple.com>
    226
  • trunk/Source/WebCore/platform/network/curl/CertificateInfo.h

    r278253 r285838  
    3636
    3737class CertificateInfo {
     38    WTF_MAKE_FAST_ALLOCATED;
    3839public:
    3940    using Certificate = Vector<uint8_t>;
  • trunk/Source/WebCore/platform/network/curl/CurlContext.cpp

    r285146 r285838  
    777777}
    778778
     779std::optional<SSL*> CurlHandle::sslConnection() const
     780{
     781    curl_tlssessioninfo* info = nullptr;
     782
     783    auto errorCode = curl_easy_getinfo(m_handle, CURLINFO_TLS_SSL_PTR, &info);
     784    if (errorCode != CURLE_OK)
     785        return std::nullopt;
     786
     787    if (!info || info->backend != CURLSSLBACKEND_OPENSSL || !info->internals)
     788        return std::nullopt;
     789
     790    return static_cast<SSL*>(info->internals);
     791}
     792
    779793std::optional<NetworkLoadMetrics> CurlHandle::getNetworkLoadMetrics(MonotonicTime startTime)
    780794{
     
    872886    auto additionalMetrics = AdditionalNetworkLoadMetricsForWebInspector::create();
    873887    if (!m_tlsConnectionInfo) {
    874         curl_tlssessioninfo* info = nullptr;
    875 
    876         errorCode = curl_easy_getinfo(m_handle, CURLINFO_TLS_SSL_PTR, &info);
    877         if (errorCode != CURLE_OK)
    878             return;
    879 
    880         if (info && info->backend == CURLSSLBACKEND_OPENSSL && info->internals) {
    881             auto ssl = static_cast<SSL*>(info->internals);
    882 
     888        if (auto ssl = sslConnection()) {
    883889            m_tlsConnectionInfo = makeUnique<TLSConnectionInfo>();
    884             m_tlsConnectionInfo->protocol = OpenSSL::tlsVersion(ssl);
    885             m_tlsConnectionInfo->cipher = OpenSSL::tlsCipherName(ssl);
     890            m_tlsConnectionInfo->protocol = OpenSSL::tlsVersion(*ssl);
     891            m_tlsConnectionInfo->cipher = OpenSSL::tlsCipherName(*ssl);
    886892        }
    887893    }
     
    907913std::optional<CertificateInfo> CurlHandle::certificateInfo() const
    908914{
    909     if (!m_sslVerifier)
    910         return std::nullopt;
    911 
    912     return m_sslVerifier->certificateInfo();
     915    if (m_sslVerifier && !m_sslVerifier->certificateInfo().isEmpty())
     916        return m_sslVerifier->certificateInfo();
     917
     918    // If you use an existing HTTP/2 connection, SSLVerifier does not exist.
     919    if (m_certificateInfo)
     920        return *m_certificateInfo;
     921
     922    if (auto ssl = sslConnection()) {
     923        if (auto certificateInfo = OpenSSL::createCertificateInfo(*ssl)) {
     924            m_certificateInfo = WTFMove(certificateInfo);
     925            return *m_certificateInfo;
     926        }
     927    }
     928
     929    return std::nullopt;
    913930}
    914931
  • trunk/Source/WebCore/platform/network/curl/CurlContext.h

    r282904 r285838  
    2727#pragma once
    2828
     29#include "CertificateInfo.h"
    2930#include "CurlProxySettings.h"
    3031#include "CurlSSLHandle.h"
     
    331332    CURLcode willSetupSslCtx(void* sslCtx);
    332333
     334    std::optional<SSL*> sslConnection() const;
     335
    333336    CURL* m_handle { nullptr };
    334337    char m_errorBuffer[CURL_ERROR_SIZE] { };
     
    339342    std::unique_ptr<CurlSSLVerifier> m_sslVerifier;
    340343    std::unique_ptr<TLSConnectionInfo> m_tlsConnectionInfo;
     344    mutable std::unique_ptr<CertificateInfo> m_certificateInfo;
    341345};
    342346
  • trunk/Source/WebCore/platform/network/curl/OpenSSLHelper.cpp

    r282904 r285838  
    6868class StackOfX509 {
    6969public:
     70    StackOfX509(STACK_OF(X509)* certs)
     71        : m_certs { certs }
     72        , m_owner { false }
     73    {
     74    }
     75
    7076    StackOfX509(X509_STORE_CTX* ctx)
    7177        : m_certs { X509_STORE_CTX_get1_chain(ctx) }
     78        , m_owner { true }
    7279    {
    7380    }
     
    7582    ~StackOfX509()
    7683    {
    77         if (m_certs)
     84        if (m_certs && m_owner)
    7885            sk_X509_pop_free(m_certs, X509_free);
    7986    }
     
    8390
    8491private:
    85     STACK_OF(X509)* m_certs { nullptr };
     92    STACK_OF(X509)* m_certs;
     93    bool m_owner;
    8694};
    8795
     
    142150
    143151
    144 static Vector<WebCore::CertificateInfo::Certificate> pemDataFromCtx(X509_STORE_CTX* ctx)
     152static Vector<WebCore::CertificateInfo::Certificate> pemDataFromCtx(StackOfX509&& certs)
    145153{
    146154    Vector<WebCore::CertificateInfo::Certificate> result;
    147     StackOfX509 certs { ctx };
    148155
    149156    for (int i = 0; i < certs.count(); i++) {
     
    159166}
    160167
     168std::unique_ptr<WebCore::CertificateInfo> createCertificateInfo(SSL* ssl)
     169{
     170    if (!ssl)
     171        return nullptr;
     172
     173    auto certChain = SSL_get_peer_cert_chain(ssl);
     174
     175    return makeUnique<WebCore::CertificateInfo>(X509_V_OK, pemDataFromCtx(StackOfX509(certChain)));
     176}
     177
    161178std::optional<WebCore::CertificateInfo> createCertificateInfo(X509_STORE_CTX* ctx)
    162179{
     
    164181        return std::nullopt;
    165182
    166     return WebCore::CertificateInfo(X509_STORE_CTX_get_error(ctx), pemDataFromCtx(ctx));
     183    return WebCore::CertificateInfo(X509_STORE_CTX_get_error(ctx), pemDataFromCtx(StackOfX509(ctx)));
    167184}
    168185
  • trunk/Source/WebCore/platform/network/curl/OpenSSLHelper.h

    r282904 r285838  
    3232namespace OpenSSL {
    3333
     34std::unique_ptr<WebCore::CertificateInfo> createCertificateInfo(SSL*);
    3435std::optional<WebCore::CertificateInfo> createCertificateInfo(X509_STORE_CTX*);
    3536std::optional<WebCore::CertificateSummary> createSummaryInfo(const Vector<uint8_t>& pem);
Note: See TracChangeset for help on using the changeset viewer.