glincker/sslx
GitHub: glincker/sslx
sslx 是一个用 Rust 和 rustls 构建的快速终端 TLS 工具,旨在以简洁的单一命令替代繁琐的 OpenSSL CLI 操作。
Stars: 10 | Forks: 2
# sslx
**openssl,但你不需要去搜索那些 flags。**
这是一个单一的二进制文件,用于处理证书、TLS 连接以及所有那些你通常需要运行三次不同 openssl 命令才能搞定的事情。使用 Rust 和 [rustls](https://github.com/rustls/rustls) 构建,不需要系统级的 OpenSSL。
[](https://crates.io/crates/sslx)
[](https://github.com/glincker/sslx/actions)
[](https://github.com/glincker/sslx/blob/main/LICENSE)

## 安装
```
cargo install sslx
```
在[发布页面](https://github.com/glincker/sslx/releases)下载预构建的二进制文件。
Homebrew:
```
brew install glincker/tap/sslx
```
或者直接下载:
```
# macOS (Apple Silicon)
curl -fsSL https://github.com/glincker/sslx/releases/latest/download/sslx-macos-aarch64 -o sslx && chmod +x sslx
# Linux
curl -fsSL https://github.com/glincker/sslx/releases/latest/download/sslx-linux-x86_64 -o sslx && chmod +x sslx
```
## TLS 评级
评估任何主机的 TLS 配置,就像 SSL Labs 一样,但直接在你的终端中运行:
```
$ sslx grade github.com
╭──────────────────────────────────────────╮
│ github.com:443 Grade: A+ │
╰──────────────────────────────────────────╯
✓ Protocol TLS 1.3
✓ Cipher TLS13_AES_128_GCM_SHA256 (AEAD)
✓ Certificate Valid, 49 days remaining
✓ Key ECDSA P-256 (256 bit)
✓ Hostname github.com in SANs
✓ Chain Complete (3 certs)
✓ ALPN HTTP/2 supported
```
检查协议版本、加密套件强度、证书有效性、密钥类型、主机名匹配、证书链完整性以及 ALPN。为你提供从 A+ 到 F 的字母评级。
## 过期检查
一次性检查多个主机的证书过期情况:
```
$ sslx expiry google.com github.com cloudflare.com stripe.com
Host Expires Days Status
────────────────────────────────────────────────────────────────
✓ google.com:443 2026-06-15 61 OK
✓ github.com:443 2026-06-03 49 OK
✓ cloudflare.com:443 2026-06-10 56 OK
✓ stripe.com:443 2026-09-01 139 OK
```
如果有任何证书将在 7 天内过期,则退出码为 1。在 cron 作业或 CI pipeline 中非常有用。
## 检查证书
通过带颜色的输出读取 PEM 或 DER 证书文件:
```
$ sslx inspect cert.pem
╭─ Certificate 1 of 1 ──────────────────────────────────╮
│ Subject: CN=*.example.com │
│ Issuer: CN=Let's Encrypt Authority X3 │
│ Serial: 0A:1B:2C:3D... │
│ │
│ Valid: 2026-01-15 → 2026-04-15 │
│ Expires: ██░░░░░░░░ 12 days remaining [!] │
│ │
│ Key: ECDSA P-256 (256 bit) │
│ SANs: *.example.com, example.com │
│ SHA-256: AB:CD:EF:12:34... │
╰──────────────────────────────────────────────────────────╯
```
也支持处理多证书 bundle。自动检测 PEM 还是 DER 格式。
## 连接到主机
查看任何主机的完整 TLS 握手细节和证书链:
```
$ sslx connect example.com
Connection to example.com:443
TLS 1.3 · TLS13_AES_256_GCM_SHA384
ALPN: h2
Chain:
╭─ Certificate 1 of 3 ─────────────────────────╮
│ Subject: CN=*.example.com │
│ Valid: 61 days remaining ✓ │
│ Key: ECDSA P-256 (256 bit) │
╰────────────────────────────────────────────────╯
↓ signed by
╭─ Certificate 2 of 3 (CA) ────────────────────╮
│ ... │
╰────────────────────────────────────────────────╯
```
## 生成证书
只需一条命令即可为本地开发生成自签名证书:
```
sslx generate --cn localhost --san "*.local,127.0.0.1"
```
默认创建使用 EC P-256 的 `cert.pem` 和 `key.pem`。同时也支持 `ec384` 和 `ed25519`。
## 生成 CSR
```
sslx csr --cn example.com --san "*.example.com,api.example.com"
```
创建 `csr.pem` 和 `key.pem`。将 CSR 提交给你的 CA。
## 格式转换
```
sslx convert cert.pem --to der # PEM to DER
sslx convert cert.der --to pem # DER to PEM
sslx convert bundle.p12 --to pem # PKCS12 to PEM
```
自动检测输入格式。
## 检查证书和密钥是否匹配
```
$ sslx match cert.pem key.pem
✓ Certificate and key match (ECDSA P-256 (256 bit))
```
不再需要手动对比 modulus hash。
## 从 PKCS12 中提取
```
sslx extract bundle.p12 --password mypass --out ./certs
```
将叶子证书、中间证书和密钥提取到单独的 PEM 文件中。
## 解码任何内容
把文件或者 JWT token 丢给它,sslx 就能弄清楚它是什么:
```
$ sslx decode eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
✓ Detected: JSON Web Token (JWT)
Header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"1234567890","name":"John","iat":1516239022}
Expires: in 3 hours
```
还支持检测 PEM 证书、DER 文件、私钥、公钥以及 CSR。
## 验证证书链
```
sslx verify cert.pem --ca ca-bundle.pem
```
```
✓ Certificate is valid
Chain: complete (3 certs)
Expiry: 328 days remaining
```
如果验证失败,它会准确地告诉你哪里出了问题,并提供如何修复的提示。
## openssl 与 sslx 对比
| 你要做的事情 | openssl | sslx |
|---|---|---|
| 查看证书 | `openssl x509 -in cert.pem -text -noout` | `sslx inspect cert.pem` |
| TLS 握手 | `openssl s_client -connect host:443 2>/dev/null \| openssl x509 -text` | `sslx connect host` |
| 验证证书链 | `openssl verify -CAfile ca.pem cert.pem` | `sslx verify cert.pem --ca ca.pem` |
| 自签名证书 | `openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 -keyout key.pem -out cert.pem -days 365 -nodes -batch -subj "/CN=localhost"` | `sslx generate --cn localhost` |
| 创建 CSR | `openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 -keyout key.pem -out csr.pem -batch -subj "/CN=example.com"` | `sslx csr --cn example.com` |
| PEM 转 DER | `openssl x509 -in cert.pem -outform DER -out cert.der` | `sslx convert cert.pem --to der` |
| 检查过期时间 | `echo \| openssl s_client -connect host:443 2>/dev/null \| openssl x509 -noout -enddate` | `sslx expiry host` |
| 证书和密钥匹配 | `diff <(openssl x509 -noout -modulus -in cert.pem) <(openssl rsa -noout -modulus -in key.pem)` | `sslx match cert.pem key.pem` |
| TLS 评级 | (访问 ssllabs.com) | `sslx grade host` |
| 解码 JWT | (访问 jwt.io) | `sslx decode ` |
## JSON 输出
每个命令都支持 `--json`,方便用于脚本和 CI:
```
# 检查过期前的剩余天数
sslx connect example.com --json | jq '.chain.certificates[0].days_remaining'
# 获取 grade
sslx grade example.com --json | jq '.grade'
# 列出所有 SANs
sslx inspect cert.pem --json | jq '.certificates[0].sans'
```
## 退出码
| 代码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 证书已过期或即将过期 |
| 3 | 证书链不受信任 |
| 4 | 连接失败 |
| 5 | 文件错误 |
## 基准测试
在 macOS M2 上运行 10 次的中位数:
| | sslx | openssl |
|---|---|---|
| 检查证书 | 2.1ms | 9.4ms |
| 生成证书 | 1.7ms | 4.5ms |
| 启动 | 1.3ms | |
## Shell 自动补全
```
sslx completions bash > /etc/bash_completion.d/sslx
sslx completions zsh > ~/.zsh/completions/_sslx
sslx completions fish > ~/.config/fish/completions/sslx.fish
```
## 贡献
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。Bug 和功能请求请提交到 [issues](https://github.com/glincker/sslx/issues)。
## 许可证
MIT
标签:Rust, rustls, TLS/SSL, 动态分析, 可视化界面, 网络检测, 网络流量审计, 证书管理, 通知系统