Skip to content

Error OpenSSL Shutdown while in init - cURL - MSSQL #14230

Closed as not planned
Closed as not planned
@AdrienHt

Description

@AdrienHt

Description

Php version: 8.2.19
Driver SQL: pdo_sqlsrv-5.12.0
MSSQL version: 2022 (16.x)
Ubuntu via Docker for Mac: Ubuntu 22.04.4 LTS (Jammy Jellyfish)

The following code:

<?php

$pdo = new \PDO('sqlsrv:server=tcp:' . getenv('SQL_HOST') . ',1433 ; Database = ' . getenv('SQL_DATABASE') . ';TrustServerCertificate=yes;', getenv('SQL_USERNAME'), getenv('SQL_PASSWORD'));

$pdo->beginTransaction();

$curlResource = curl_init();

$curlOptions = [
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_CAPATH => '/data/ca',
    CURLOPT_CAINFO => '/data/ca/serverCa.pem',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => getenv('API_URL'),
];

foreach ($curlOptions as $option => $value) {
    curl_setopt($curlResource, $option, $value);
}

$responseContent = curl_exec($curlResource);
$errorNumber = curl_errno($curlResource);
$errorMessage = curl_error($curlResource);

curl_close($curlResource);

if ($errorNumber > 0) {
    echo 'Curl error: ' . $errorNumber . ' - ' . $errorMessage. "\n" ;
    $pdo->rollBack();
}

echo $responseContent;

Resulted in this output:

Curl error: 60 - SSL certificate problem: unable to get local issuer certificate

PHP Fatal error:  Uncaught PDOException: SQLSTATE[08S01]: [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:140E0197:SSL routines:SSL_shutdown:shutdown while in init] in /data/test.php:30
Stack trace:
0 /data/test.php(30): PDO->rollBack()
1 {main}
  thrown in /data/test.php on line 30

But I expected no SQL error, only the cURL error :

Curl error: 60 - SSL certificate problem: unable to get local issuer certificate // no SQL error

The error only happens when the curl CA verification reports a certificate not allowed.
The error does not happen when I remove TrustServerCertificate=yes in the dsn.
The error does not happen when CURLOPT_SSL_VERIFYPEER is set to false.

It's seems that the Mssql driver call openssl function SSL_shutdown() while SSL_in_init() send true.

The SSL_in_init() seems to return true only when the curl CA verification reports a certificate not allowed.

I don't know if php curl implementation does not close the connection correctly or if the MSSQL driver should check if SSL_in_init() returns true before calling SSL_shutdown(), but there is something wrong here.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions