You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台Npgsql SSL握手异常求助(自签名证书场景)

自签名证书连接PostgreSQL时Android端SSL握手异常排查与解决

环境信息

  • 目标框架:net6.0-android; net6.0-ios; net6.0-maccatalyst; net6.0-windows10.0.19041.0
  • PostgreSQL版本:14.5(64位,Visual C++ build 1914编译)
  • Npgsql版本:6.0.6

Npgsql配置代码

pg_sb.SslMode = Npgsql.SslMode.Require;
pg_sb.TrustServerCertificate = true;
pg_sb.IncludeErrorDetail = true;

测试情况

  • Windows平台(net6.0-windows10):SSL握手正常,连接无异常
  • Android设备(net6.0-Android 12 API 31):出现SSL握手异常,错误栈如下:
{Npgsql.NpgsqlException (0x80004005): Exception while performing SSL handshake
---> System.Security.Authentication.AuthenticationException: 
Authentication failed, see inner exception.
---> Interop+AndroidCrypto+SslException: Exception of type 
'Interop+AndroidCrypto+SslException' was thrown.
--- End of inner exception stack trace ---

at System.Net.Security.SslStream.<ForceAuthenticationAsync>d__175`1
[[System.Net.Security.SyncReadWriteAdapter, 
System.Net.Security, Version=6.0.0.0, Culture=neutral, 
PublicKeyToken=b03f5f7f11d50a3a]].MoveNext()
at System.Net.Security.SslStream.AuthenticateAsClient
(SslClientAuthenticationOptions sslClientAuthenticationOptions)
at System.Net.Security.SslStream.AuthenticateAsClient
(String targetHost, X509CertificateCollection 
clientCertificates, SslProtocols enabledSslProtocols, 
Boolean checkCertificateRevocation)
at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode,
NpgsqlTimeout timeout, Boolean async, 
CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, 
NpgsqlTimeout timeout, Boolean async, 
CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|191_1
(NpgsqlConnector conn, SslMode sslMode, 
NpgsqlTimeout timeout, Boolean async, 
CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, 
Boolean async, CancellationToken cancellationToken)
at Npgsql.UnpooledConnectorSource.Get(NpgsqlConnection conn, 
NpgsqlTimeout timeout, Boolean async, 
CancellationToken cancellationToken) at 
Npgsql.NpgsqlConnection.<Open>g__OpenAsync|45_0(Boolean async, 
CancellationToken cancellationToken) at 
Npgsql.NpgsqlConnection.Open() at pgDynProc.poolcn.connect.Open() in 
Npgsql.NpgsqlException

排查原因及解决办法

可能原因

  1. Android系统SSL协议兼容性:Android 12默认禁用TLS 1.0/1.1,若PostgreSQL服务器默认SSL协议范围包含旧版本,会导致协议协商失败;或Npgsql在Android端默认使用的SSL协议与服务器不匹配。
  2. 自签名证书算法限制:Android对SHA-1等旧哈希算法的证书有严格限制,若自签名证书使用此类算法,会被安全框架拒绝。
  3. Android平台证书信任逻辑差异:即便设置TrustServerCertificate = true,Android的SslStream实现可能未正确跳过证书验证,存在平台特定的校验逻辑。

解决办法

  • 指定兼容的SSL协议版本:在Npgsql配置中明确指定服务器支持的TLS版本(如TLS 1.2/1.3),示例代码:
    pg_sb.SslMode = Npgsql.SslMode.Require;
    pg_sb.TrustServerCertificate = true;
    pg_sb.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13; // 根据服务器实际支持情况调整
    
  • 重新生成合规自签名证书:使用SHA-256及以上哈希算法、RSA密钥长度≥2048位生成证书,示例OpenSSL命令:
    openssl req -new -x509 -days 3650 -sha256 -newkey rsa:2048 -keyout server.key -out server.crt -nodes
    
  • 手动导入证书到Android设备:将自签名证书安装到Android设备的“信任凭据”中(系统级或应用级),部分Android版本需显式信任证书才能跳过验证。
  • 升级Npgsql版本:尝试升级到Npgsql 6.x系列的较新版本(如6.0.10及以上),修复可能存在的Android平台SSL适配问题。

内容的提问来源于stack exchange,提问作者Dmitry Ivanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:57:27