284 lines
8.0 KiB
Go
284 lines
8.0 KiB
Go
// Package variable 提供 SSL/TLS 相关变量。
|
||
//
|
||
// 该文件包含 mTLS 客户端证书变量,用于日志和访问控制:
|
||
// - $ssl_client_verify: 客户端证书验证结果
|
||
// - $ssl_client_serial: 客户端证书序列号
|
||
// - $ssl_client_subject: 客户端证书主题
|
||
// - $ssl_client_issuer: 客户端证书颁发者
|
||
// - $ssl_client_fingerprint: 客户端证书指纹
|
||
// - $ssl_client_notbefore: 证书生效时间
|
||
// - $ssl_client_notafter: 证书过期时间
|
||
//
|
||
// 作者:xfy
|
||
package variable
|
||
|
||
import (
|
||
"github.com/valyala/fasthttp"
|
||
)
|
||
|
||
// SSL 变量常量
|
||
const (
|
||
// VarSSLClientVerify SSL 客户端证书验证结果变量。
|
||
VarSSLClientVerify = "ssl_client_verify"
|
||
// VarSSLClientSerial SSL 客户端证书序列号变量。
|
||
VarSSLClientSerial = "ssl_client_serial"
|
||
// VarSSLClientSubject SSL 客户端证书主题变量。
|
||
VarSSLClientSubject = "ssl_client_subject"
|
||
// VarSSLClientIssuer SSL 客户端证书颁发者变量。
|
||
VarSSLClientIssuer = "ssl_client_issuer"
|
||
// VarSSLClientFingerprint SSL 客户端证书指纹变量。
|
||
VarSSLClientFingerprint = "ssl_client_fingerprint"
|
||
// VarSSLClientNotBefore SSL 客户端证书生效时间变量。
|
||
VarSSLClientNotBefore = "ssl_client_notbefore"
|
||
// VarSSLClientNotAfter SSL 客户端证书过期时间变量。
|
||
VarSSLClientNotAfter = "ssl_client_notafter"
|
||
// VarSSLClientDNS SSL 客户端证书主题 DN 变量。
|
||
VarSSLClientDNS = "ssl_client_s_dn"
|
||
// VarSSLClientEmail SSL 客户端证书邮箱变量。
|
||
VarSSLClientEmail = "ssl_client_email"
|
||
|
||
sslProtocolNone = "NONE"
|
||
)
|
||
|
||
// init 注册 SSL 变量
|
||
func init() {
|
||
// $ssl_client_verify - 客户端证书验证结果
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientVerify,
|
||
Description: "客户端证书验证结果 (SUCCESS/FAIL/NONE)",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientVerify(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_serial - 客户端证书序列号
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientSerial,
|
||
Description: "客户端证书序列号",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientSerial(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_subject - 客户端证书主题
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientSubject,
|
||
Description: "客户端证书主题 (DN)",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientSubject(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_issuer - 客户端证书颁发者
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientIssuer,
|
||
Description: "客户端证书颁发者 (DN)",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientIssuer(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_fingerprint - 客户端证书指纹
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientFingerprint,
|
||
Description: "客户端证书 SHA1 指纹",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientFingerprint(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_notbefore - 证书生效时间
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientNotBefore,
|
||
Description: "客户端证书生效时间 (ISO8601)",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientNotBefore(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_notafter - 证书过期时间
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientNotAfter,
|
||
Description: "客户端证书过期时间 (ISO8601)",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientNotAfter(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_s_dn - 客户端证书主题 DN
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientDNS,
|
||
Description: "客户端证书主题 DN (RFC2253 格式)",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientSubject(ctx)
|
||
},
|
||
})
|
||
|
||
// $ssl_client_email - 客户端证书邮箱
|
||
RegisterBuiltin(&BuiltinVariable{
|
||
Name: VarSSLClientEmail,
|
||
Description: "客户端证书中的邮箱地址",
|
||
Getter: func(ctx *fasthttp.RequestCtx) string {
|
||
return GetSSLClientEmail(ctx)
|
||
},
|
||
})
|
||
}
|
||
|
||
// GetSSLClientVerify 获取客户端证书验证结果。
|
||
//
|
||
// 返回值:
|
||
// - "SUCCESS": 验证成功
|
||
// - "FAIL": 验证失败
|
||
// - "NONE": 未提供证书
|
||
func GetSSLClientVerify(ctx *fasthttp.RequestCtx) string {
|
||
if ctx == nil {
|
||
return sslProtocolNone
|
||
}
|
||
|
||
// 检查是否有 TLS 连接信息
|
||
if !ctx.IsTLS() {
|
||
return sslProtocolNone
|
||
}
|
||
|
||
// 从 UserValue 获取验证状态(由连接处理器设置)
|
||
if v := ctx.UserValue(VarSSLClientVerify); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
|
||
// 检查是否提供了证书
|
||
if ctx.UserValue("tls_peer_cert_present") != nil {
|
||
return "SUCCESS"
|
||
}
|
||
|
||
return sslProtocolNone
|
||
}
|
||
|
||
// GetSSLClientSerial 获取客户端证书序列号。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书的序列号。
|
||
// 证书信息由连接处理器通过 SetSSLClientInfoInContext 预先设置。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书序列号字符串,未提供证书时返回空字符串
|
||
func GetSSLClientSerial(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientSerial); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// GetSSLClientSubject 获取客户端证书主题。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书的主题(Distinguished Name)。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书主题字符串,未提供证书时返回空字符串
|
||
func GetSSLClientSubject(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientSubject); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// GetSSLClientIssuer 获取客户端证书颁发者。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书的颁发者(Distinguished Name)。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书颁发者字符串,未提供证书时返回空字符串
|
||
func GetSSLClientIssuer(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientIssuer); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// GetSSLClientFingerprint 获取客户端证书指纹。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书的 SHA1 指纹。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书 SHA1 指纹(十六进制大写),未提供证书时返回空字符串
|
||
func GetSSLClientFingerprint(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientFingerprint); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// GetSSLClientNotBefore 获取客户端证书生效时间。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书的生效时间(ISO8601 格式)。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书生效时间,格式为 "2006-01-02T15:04:05Z",未提供证书时返回空字符串
|
||
func GetSSLClientNotBefore(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientNotBefore); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// GetSSLClientNotAfter 获取客户端证书过期时间。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书的过期时间(ISO8601 格式)。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书过期时间,格式为 "2006-01-02T15:04:05Z",未提供证书时返回空字符串
|
||
func GetSSLClientNotAfter(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientNotAfter); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// GetSSLClientEmail 获取客户端证书邮箱。
|
||
//
|
||
// 从请求上下文中读取 mTLS 客户端证书中包含的邮箱地址。
|
||
//
|
||
// 参数:
|
||
// - ctx: fasthttp 请求上下文
|
||
//
|
||
// 返回值:
|
||
// - string: 证书中的第一个邮箱地址,未提供证书或无邮箱时返回空字符串
|
||
func GetSSLClientEmail(ctx *fasthttp.RequestCtx) string {
|
||
if v := ctx.UserValue(VarSSLClientEmail); v != nil {
|
||
if s, ok := v.(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
return ""
|
||
}
|