Skip to content

HTTPS 支持

Cosy 框架提供了内置的 HTTPS 支持,允许您的应用程序通过安全的 HTTPS 协议提供服务。这在处理敏感数据时尤为重要,例如用户凭证、支付信息等。

配置项

Cosy 支持 INI 和 TOML 两种配置格式。以下是在两种格式中设置 HTTPS 相关选项的示例:

INI 格式配置 (默认)

app.ini 配置文件的 [server] 部分:

ini
[server]
Host        = 127.0.0.1
Port        = 9443
RunMode     = debug
BaseUrl     = https://api.example.com
EnableHTTPS = true
SSLCert     = /path/to/certificate.pem
SSLKey      = /path/to/key.pem

TOML 格式配置 (使用 toml_settings 构建标签)

app.toml 配置文件的 [server] 部分:

toml
[server]
Host = "127.0.0.1"
Port = 9443
RunMode = "debug"
BaseUrl = "https://api.example.com"
EnableHTTPS = true
SSLCert = "/path/to/certificate.pem"
SSLKey = "/path/to/key.pem"
配置项类型描述
EnableHTTPSbool是否启用 HTTPS 服务
SSLCertstringSSL 证书文件的绝对路径
SSLKeystringSSL 私钥文件的绝对路径

工作原理

EnableHTTPS 设置为 true 时,Cosy 将使用 TLS 配置启动一个 HTTPS 服务器。否则,将使用 http.Server.Serve() 方法启动一个标准的 HTTP 服务器。

Cosy 现在支持证书热重载,这意味着您可以更新证书文件而不需要重启服务器。系统会使用缓存机制来存储证书,以优化性能。

go
// 证书热重载机制摘要
tlsConfig := &tls.Config{
    GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
        certVal, ok := tlsCertCache.Load().(tls.Certificate)
        if !ok {
            return nil, errors.New("no valid certificate available")
        }
        return &certVal, nil
    },
}

证书热重载

当您更新了证书文件后,可以通过调用 ReloadTLSCertificate() 函数来重新加载证书:

go
// 手动重载证书示例
if err := cosy.ReloadTLSCertificate(); err != nil {
    logger.Error("无法重新加载证书:", err)
}

获取 SSL 证书

开发环境

对于开发环境,您可以生成自签名证书:

bash
# 生成私钥
openssl genrsa -out server.key 2048

# 生成自签名证书
openssl req -new -x509 -key server.key -out server.crt -days 365

请注意,浏览器会警告自签名证书不受信任,但这对开发环境来说通常是可以接受的。

生产环境

对于生产环境,建议使用受信任的证书颁发机构(CA)颁发的证书,例如:

  • Let's Encrypt(免费)
  • Certbot(Let's Encrypt 的客户端)
  • 商业 CA(如 DigiCert、Comodo 等)