开发者参考

SSL证书

通过 DomScan API,查询证书透明性日志以监控为任何域名颁发的 SSL/TLS 证书。检测未授权证书、跟踪证书续订并确保安全合规。

SSL证书

查询证书透明性日志以监控为任何域名颁发的 SSL/TLS 证书。检测未授权证书、跟踪证书续订并确保安全合规。

GET /v1/certificates

查询参数

参数类型说明
domain 必需 string 要搜索证书的域名或主机名(例如,"github.com" 或 "api.github.com")
include_subdomains 可选 boolean
默认值 true
包含通配符和子域证书(默认: true)
include_expired 可选 boolean
默认值 false
包括已经过期的证书。
limit 可选 integer
默认值 100
每页返回的证书数,最多 1000 个。
cursor 可选 string 上一页返回的 next_cursor。参见分页。

使用场景

  • 通过证书SAN字段进行子域枚举
  • 检测未授权的证书颁发
  • 监控钓鱼证书
  • 审计证书过期日期

请求示例

curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/certificates?domain=github.com&include_subdomains=true"
import requests

domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})

response = domscan.get(
    "https://domscan.net/v1/certificates",
    params={"domain": "github.com", "include_subdomains": "true"}
)
data = response.json()

# Extract unique subdomains from certificates
subdomains = set()
for cert in data['certificates']:
    for name in cert.get('names', []):
        if name.endswith('.github.com'):
            subdomains.add(name)

print(f"Found {len(subdomains)} subdomains")
for subdomain in sorted(subdomains)[:10]:
    print(f"  {subdomain}")

响应示例

{
  "domain": "github.com",
  "certificates": [
                {
                "issuer": "Let's Encrypt",
                "common_name": "example.com",
                "san": ["example.com", "www.example.com"],
                "not_before": "2024-01-01T00:00:00Z",
                "not_after": "2024-04-01T00:00:00Z"
                }
                ],
                "total": 1
                }

响应字段

字段 类型
has_more boolean
next_cursor string | null
cache_age_s integer
domain string
certificates[] object[]
certificates[] object
certificates[].id string
certificates[].issuer object
certificates[].common_name string
certificates[].san[] string[]
certificates[].not_before string
certificates[].not_after string
certificates[].is_expired boolean
certificates[].is_wildcard boolean
certificates[].fingerprint_sha256 string
summary object
summary.total_found integer
summary.returned integer
summary.unique_subdomains integer
summary.issuers[] string[]
summary.earliest_cert string | null
summary.latest_cert string | null
pagination object
pagination.limit integer
pagination.offset integer
pagination.returned integer
pagination.total integer
pagination.has_more boolean
pagination.next_cursor string | null
intelligence_summary object
intelligence_summary.data_source string
intelligence_summary.ct_log_sources[] string[]
intelligence_summary.source_count integer
intelligence_summary.cache_status string
intelligence_summary.returned_count integer
intelligence_summary.total_found integer
intelligence_summary.truncated boolean
intelligence_summary.limit integer
intelligence_summary.include_subdomains boolean
intelligence_summary.include_expired boolean
intelligence_summary.unique_name_count integer
intelligence_summary.unique_subdomains integer
intelligence_summary.issuer_count integer
intelligence_summary.wildcard_cert_count integer
intelligence_summary.active_cert_count integer
intelligence_summary.expired_cert_count integer
intelligence_summary.expiring_within_30_days_count integer
intelligence_summary.earliest_cert string | null
intelligence_summary.latest_cert string | null
intelligence_summary.latest_expiry string | null
intelligence_summary.has_more boolean
intelligence_summary.next_cursor string | null
intelligence_summary.warning_code string | null
meta object
GET /v1/ssl/audit 积分: 5

查询参数

参数 类型 必需
domain string 必需

响应字段

字段 类型
domain string
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
audit_completeness string
probe_coverage object
probe_coverage.tls_inspect boolean
probe_coverage.tls_audit boolean
probe_coverage.tls_posture boolean
probe_coverage.revocation boolean
probe_coverage.hsts boolean
probe_coverage.http_versions boolean
certificate object
certificate.subject string
certificate.issuer string
certificate.issuer_org string
certificate.valid_from string
certificate.valid_until string
certificate.days_remaining integer
certificate.expired boolean
certificate.san[] string[]
certificate.key_type string
certificate.key_size integer
certificate.signature_algorithm string
certificate.serial_number string
certificate.fingerprint_sha256 string
certificate.hostname_match boolean | null
chain object
chain.length integer
chain.valid boolean
chain.certificates[] object[]
chain.certificates[] object
chain.certificates[].subject string
chain.certificates[].issuer string
chain.certificates[].type string
chain.certificates[].valid_from string | null
chain.certificates[].valid_until string | null
chain.issues[] string[]
protocols object
protocols.tls_1_3 boolean
protocols.tls_1_2 boolean
protocols.tls_1_1 boolean
protocols.tls_1_0 boolean
protocols.ssl_3 boolean
protocols.preferred_protocol string
protocols.detection_method string
protocols.deprecated_protocols_enabled boolean
connection object
connection.preferred_protocol string | null
connection.preferred_cipher string | null
connection.alpn_negotiated string | null
connection.forward_secrecy boolean
connection.forward_secrecy_cipher string | null
connection.secure_renegotiation_supported boolean | null
connection.server_temp_key string | null
connection.peer_signing_digest string | null
connection.peer_signature_type string | null
connection.server_public_key_bits integer | null
connection.compression string | null
connection.expansion string | null
connection.client_certificate_requested boolean | null
certificate_delivery object
certificate_delivery.must_staple boolean
certificate_delivery.sct_embedded boolean
certificate_delivery.sct_count integer
certificate_delivery.ocsp_stapling_present boolean
certificate_delivery.ocsp_stapling_fresh boolean | null
certificate_delivery.ocsp_stapling_status string | null
certificate_delivery.ocsp_this_update string | null
certificate_delivery.ocsp_next_update string | null
handshake_size object
handshake_size.chain_certificate_count integer
handshake_size.estimated_certificate_bytes integer
handshake_size.estimated_handshake_bytes integer
handshake_size.risk string
handshake_size.mobile_client_warning boolean
alpn_summary object
alpn_summary.negotiated_protocol string | null
alpn_summary.http2_ready boolean | null
alpn_summary.http3_advertised boolean | null
alpn_summary.fallback_protocols[] string[]
alpn_summary.evidence_sources[] string[]
transport object
transport.hsts object
transport.hsts.reachable boolean
transport.hsts.final_url string | null
transport.hsts.status_code integer | null
transport.hsts.header_present boolean
transport.hsts.hsts_header string | null
transport.hsts.max_age integer | null
transport.hsts.include_subdomains boolean | null
transport.hsts.preload_directive boolean | null
transport.hsts.preload_eligible boolean
transport.hsts.preload_status string | null
transport.hsts.preloaded_domain string | null
transport.hsts.issues[] string[]
transport.hsts.errors[] string[]
transport.http_versions object
transport.http_versions.http1_1 boolean
transport.http_versions.http2 boolean
transport.http_versions.http3 boolean
transport.http_versions.alt_svc string | null
transport.http_versions.http3_advertised boolean
transport.http_versions.alt_svc_protocols[] string[]
transport.http_versions.curl_http3_supported boolean
revocation object
revocation.ocsp object
revocation.ocsp.present boolean
revocation.ocsp.uris[] string[]
revocation.ocsp.checked_uri string | null
revocation.ocsp.status string | null
revocation.ocsp.verify_ok boolean
revocation.ocsp.this_update string | null
revocation.ocsp.next_update string | null
revocation.ocsp.error string | null
revocation.crl object
revocation.crl.present boolean
revocation.crl.uris[] string[]
revocation.crl.checked_uri string | null
revocation.crl.fetched boolean
revocation.crl.http_status integer | null
revocation.crl.revoked boolean | null
revocation.crl.last_update string | null
revocation.crl.next_update string | null
revocation.crl.revoked_serial_count integer | null
revocation.crl.error string | null
tls_extensions[] string[]
edge_summary object
edge_summary.relay_configured boolean
edge_summary.evidence_sources[] string[]
edge_summary.probe_success_count integer
edge_summary.probe_attempt_count integer
edge_summary.live_handshake_ms integer | null
edge_summary.strongest_protocol string | null
edge_summary.weakest_supported_protocol string | null
edge_summary.deprecated_protocol_count integer
edge_summary.http3_ready boolean
edge_summary.hsts_preload_ready boolean
edge_summary.revocation_checked boolean
edge_summary.revocation_good boolean | null
edge_summary.certificate_transparency_ready boolean
edge_summary.client_auth_requested boolean | null
edge_summary.weak_transport_detected boolean
issues[] string[]
recommendations[] string[]
checked_at string
check_duration_ms integer

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/audit?domain=example.com"
const response = await fetch("https://domscan.net/v1/ssl/audit?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/audit?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/audit?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/audit?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "domain": "cloudflare.com",
  "audit_completeness": "full",
  "probe_coverage": {
    "tls_inspect": true,
    "tls_audit": true,
    "tls_posture": true,
    "revocation": true,
    "hsts": true,
    "http_versions": true
  },
  "certificate": {
    "subject": "cloudflare.com",
    "issuer": "Google Trust Services",
    "valid_from": "2026-03-01T00:00:00Z",
    "valid_until": "2026-05-30T23:59:59Z",
    "days_remaining": 42,
    "expired": false,
    "san": [
      "cloudflare.com",
      "*.cloudflare.com"
    ],
    "key_type": "ECDSA",
    "key_size": 256,
    "signature_algorithm": "ecdsaWithSHA256",
    "serial_number": "539933F4CFE7E8CF13F5E60D139675A1",
    "fingerprint_sha256": "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99",
    "hostname_match": true
  },
  "chain": {
    "length": 3,
    "valid": true,
    "certificates": [
      {
        "subject": "cloudflare.com",
        "issuer": "Google Trust Services",
        "type": "leaf"
      },
      {
        "subject": "Google Trust Services",
        "issuer": "GlobalSign",
        "type": "intermediate"
      },
      {
        "subject": "GlobalSign",
        "issuer": "GlobalSign",
        "type": "root"
      }
    ],
    "issues": []
  },
  "protocols": {
    "tls_1_3": true,
    "tls_1_2": true,
    "tls_1_1": false,
    "tls_1_0": false,
    "ssl_3": false,
    "preferred_protocol": "TLSv1.3",
    "detection_method": "active",
    "deprecated_protocols_enabled": false
  },
  "connection": {
    "preferred_protocol": "TLSv1.3",
    "preferred_cipher": "TLS_AES_256_GCM_SHA384",
    "alpn_negotiated": "h2",
    "forward_secrecy": true,
    "forward_secrecy_cipher": "TLS_AES_256_GCM_SHA384",
    "secure_renegotiation_supported": false,
    "server_temp_key": "X25519, 253 bits",
    "peer_signing_digest": "SHA256",
    "peer_signature_type": "ECDSA",
    "server_public_key_bits": 256,
    "compression": "NONE",
    "expansion": "NONE",
    "client_certificate_requested": false
  },
  "certificate_delivery": {
    "must_staple": false,
    "sct_embedded": true,
    "sct_count": 2,
    "ocsp_stapling_present": true,
    "ocsp_stapling_fresh": true,
    "ocsp_stapling_status": "successful (0x0)",
    "ocsp_this_update": "2026-04-15T02:35:16Z",
    "ocsp_next_update": "2026-04-22T01:35:15Z"
  },
  "handshake_size": {
    "chain_certificate_count": 3,
    "estimated_certificate_bytes": 3200,
    "estimated_handshake_bytes": 4600,
    "risk": "low",
    "mobile_client_warning": false
  },
  "alpn_summary": {
    "negotiated_protocol": "h2",
    "http2_ready": true,
    "http3_advertised": true,
    "fallback_protocols": [
      "TLSv1.3",
      "TLSv1.2",
      "http/1.1"
    ],
    "evidence_sources": [
      "tls_audit",
      "http_versions"
    ]
  },
  "transport": {
    "hsts": {
      "reachable": true,
      "final_url": "https://cloudflare.com/",
      "status_code": 200,
      "header_present": true,
      "hsts_header": "max-age=31536000; includeSubDomains",
      "max_age": 31536000,
      "include_subdomains": true,
      "preload_directive": false,
      "preload_eligible": true,
      "preload_status": "preloaded",
      "preloaded_domain": "cloudflare.com",
      "issues": [
        "missing preload directive"
      ],
      "errors": []
    },
    "http_versions": {
      "http1_1": true,
      "http2": true,
      "http3": true,
      "alt_svc": "h3=\":443\"; ma=86400",
      "http3_advertised": true,
      "alt_svc_protocols": [
        "h3"
      ],
      "curl_http3_supported": true
    }
  },
  "revocation": {
    "ocsp": {
      "present": true,
      "uris": [
        "http://o.pki.goog/wr2"
      ],
      "checked_uri": "http://o.pki.goog/wr2",
      "status": "good",
      "verify_ok": true,
      "this_update": "2026-04-18T20:30:00Z",
      "next_update": "2026-04-19T20:30:00Z",
      "error": null
    },
    "crl": {
      "present": true,
      "uris": [
        "http://c.pki.goog/wr2.crl"
      ],
      "checked_uri": "http://c.pki.goog/wr2.crl",
      "fetched": true,
      "http_status": 200,
      "revoked": false,
      "last_update": "2026-04-17T00:00:00Z",
      "next_update": "2026-04-24T00:00:00Z",
      "revoked_serial_count": 0,
      "error": null
    }
  },
  "tls_extensions": [
    "key share",
    "supported versions",
    "server name"
  ],
  "edge_summary": {
    "relay_configured": true,
    "evidence_sources": [
      "tls_inspect",
      "tls_audit",
      "tls_posture",
      "revocation",
      "hsts",
      "http_versions"
    ],
    "probe_success_count": 6,
    "probe_attempt_count": 6,
    "live_handshake_ms": 51,
    "strongest_protocol": "TLSv1.3",
    "weakest_supported_protocol": "TLSv1.2",
    "deprecated_protocol_count": 0,
    "http3_ready": true,
    "hsts_preload_ready": true,
    "revocation_checked": true,
    "revocation_good": true,
    "certificate_transparency_ready": true,
    "client_auth_requested": false,
    "weak_transport_detected": false
  },
  "issues": [],
  "recommendations": [
    "Add the preload directive if you want HSTS preload-list eligibility."
  ],
  "checked_at": "2026-04-18T21:00:00Z",
  "check_duration_ms": 512
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多
GET /v1/ssl/deep-scan 积分: 10

查询参数

参数 类型 必需
domain string 必需
refresh boolean
默认值 false
可选
profile string
允许的值 standardfull
默认值 standard
可选

响应字段

字段 类型
cache_age_s integer
status string
domain string
host string
port integer
profile string
scan_token string
message string
poll_after_ms integer
cache object
cache.hit boolean
cache.fresh boolean
cache.started_at string | null
cache.completed_at string | null
cache.expires_at string | null
cache.engine string | null
cache.profile string | null
result object
result.domain string
result.host string
result.port integer
result.engine object
result.engine.name string
result.engine.mode string
result.engine.version string | null
result.engine.profile string
result.target object
result.target.ip string | null
result.target.service string | null
result.target.rdns string | null
result.summary object
result.summary.severity_counts object
result.summary.severity_counts.critical integer
result.summary.severity_counts.high integer
result.summary.severity_counts.medium integer
result.summary.severity_counts.low integer
result.summary.severity_counts.warn integer
result.summary.severity_counts.info integer
result.summary.severity_counts.ok integer
result.summary.actionable_findings integer
result.summary.protocols_offered[] string[]
result.summary.deprecated_protocols[] string[]
result.summary.supports_tls_1_3 boolean | null
result.summary.supports_http2 boolean | null
result.summary.supports_http3 boolean | null
result.sections object
result.sections.pretest[] object[]
result.sections.pretest[] object
result.sections.pretest[].id string
result.sections.pretest[].severity string
result.sections.pretest[].finding string
result.sections.pretest[].cve string
result.sections.pretest[].cwe string
result.sections.protocols[] object[]
result.sections.protocols[] object
result.sections.protocols[].id string
result.sections.protocols[].severity string
result.sections.protocols[].finding string
result.sections.protocols[].cve string
result.sections.protocols[].cwe string
result.sections.server_defaults[] object[]
result.sections.server_defaults[] object
result.sections.server_defaults[].id string
result.sections.server_defaults[].severity string
result.sections.server_defaults[].finding string
result.sections.server_defaults[].cve string
result.sections.server_defaults[].cwe string
result.sections.server_preferences[] object[]
result.sections.server_preferences[] object
result.sections.server_preferences[].id string
result.sections.server_preferences[].severity string
result.sections.server_preferences[].finding string
result.sections.server_preferences[].cve string
result.sections.server_preferences[].cwe string
result.sections.cipher_categories[] object[]
result.sections.cipher_categories[] object
result.sections.cipher_categories[].id string
result.sections.cipher_categories[].severity string
result.sections.cipher_categories[].finding string
result.sections.cipher_categories[].cve string
result.sections.cipher_categories[].cwe string
result.sections.forward_secrecy[] object[]
result.sections.forward_secrecy[] object
result.sections.forward_secrecy[].id string
result.sections.forward_secrecy[].severity string
result.sections.forward_secrecy[].finding string
result.sections.forward_secrecy[].cve string
result.sections.forward_secrecy[].cwe string
result.sections.vulnerabilities[] object[]
result.sections.vulnerabilities[] object
result.sections.vulnerabilities[].id string
result.sections.vulnerabilities[].severity string
result.sections.vulnerabilities[].finding string
result.sections.vulnerabilities[].cve string
result.sections.vulnerabilities[].cwe string
result.sections.browser_simulations[] object[]
result.sections.browser_simulations[] object
result.sections.browser_simulations[].id string
result.sections.browser_simulations[].severity string
result.sections.browser_simulations[].finding string
result.sections.browser_simulations[].cve string
result.sections.browser_simulations[].cwe string
result.sections.rating[] object[]
result.sections.rating[] object
result.sections.rating[].id string
result.sections.rating[].severity string
result.sections.rating[].finding string
result.sections.rating[].cve string
result.sections.rating[].cwe string
result.findings[] object[]
result.findings[] object
result.findings[].section string
result.findings[].id string
result.findings[].severity string
result.findings[].finding string
result.findings[].cve string
result.findings[].cwe string
result.checked_at string
result.scan_duration_ms integer
result.notes[] string[]
error object
error.message string
error.retryable boolean

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard"
const response = await fetch("https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/deep-scan?domain=openai.com&refresh=false&profile=standard")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "status": "ready",
  "domain": "openai.com",
  "host": "openai.com",
  "port": 443,
  "profile": "full",
  "scan_token": "eyJrIjoidGxzLWRlZXAtc2NhbiIsImkiOiJleGFtcGxlIiwiaCI6Im9wZW5haS5jb20ifQ",
  "cache": {
    "hit": true,
    "fresh": true,
    "completed_at": "2026-04-18T22:10:00Z",
    "expires_at": "2026-04-19T22:10:00Z",
    "engine": "testssl.sh",
    "profile": "full"
  },
  "result": {
    "domain": "openai.com",
    "host": "openai.com",
    "port": 443,
    "engine": {
      "name": "testssl.sh",
      "mode": "testssl",
      "version": "3.3dev",
      "profile": "full"
    },
    "target": {
      "ip": "172.64.154.211",
      "service": "HTTP",
      "rdns": "--"
    },
    "summary": {
      "severity_counts": {
        "critical": 0,
        "high": 1,
        "medium": 1,
        "low": 0,
        "warn": 1,
        "info": 6,
        "ok": 4
      },
      "actionable_findings": 3,
      "protocols_offered": [
        "TLS1_2",
        "TLS1_3"
      ],
      "deprecated_protocols": [],
      "supports_tls_1_3": true,
      "supports_http2": true,
      "supports_http3": null
    },
    "sections": {
      "pretest": [],
      "protocols": [
        {
          "id": "TLS1_2",
          "severity": "OK",
          "finding": "offered"
        },
        {
          "id": "TLS1_3",
          "severity": "OK",
          "finding": "offered with final"
        },
        {
          "id": "QUIC",
          "severity": "WARN",
          "finding": "not tested due to lack of local OpenSSL support"
        }
      ],
      "server_defaults": [
        {
          "id": "early_data",
          "severity": "HIGH",
          "finding": "supported"
        }
      ],
      "server_preferences": [],
      "cipher_categories": [],
      "forward_secrecy": [],
      "vulnerabilities": [
        {
          "id": "BREACH",
          "severity": "MEDIUM",
          "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
          "cve": "CVE-2013-3587",
          "cwe": "CWE-310"
        }
      ],
      "browser_simulations": [],
      "rating": []
    },
    "findings": [
      {
        "section": "protocols",
        "id": "QUIC",
        "severity": "WARN",
        "finding": "not tested due to lack of local OpenSSL support"
      },
      {
        "section": "server_defaults",
        "id": "early_data",
        "severity": "HIGH",
        "finding": "supported"
      },
      {
        "section": "vulnerabilities",
        "id": "BREACH",
        "severity": "MEDIUM",
        "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
        "cve": "CVE-2013-3587",
        "cwe": "CWE-310"
      }
    ],
    "checked_at": "2026-04-18T22:10:00Z",
    "scan_duration_ms": 53880,
    "notes": []
  }
}

HTTP 状态码

  • 200 成功
  • 202 已接受
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 424 HTTP 424
  • 429 请求过多
GET /v1/ssl/deep-scan/status 积分: 0

查询参数

参数 类型 必需
scan_token string 必需

响应字段

字段 类型
cache_age_s integer
status string
domain string
host string
port integer
profile string
scan_token string
message string
poll_after_ms integer
cache object
cache.hit boolean
cache.fresh boolean
cache.started_at string | null
cache.completed_at string | null
cache.expires_at string | null
cache.engine string | null
cache.profile string | null
result object
result.domain string
result.host string
result.port integer
result.engine object
result.engine.name string
result.engine.mode string
result.engine.version string | null
result.engine.profile string
result.target object
result.target.ip string | null
result.target.service string | null
result.target.rdns string | null
result.summary object
result.summary.severity_counts object
result.summary.severity_counts.critical integer
result.summary.severity_counts.high integer
result.summary.severity_counts.medium integer
result.summary.severity_counts.low integer
result.summary.severity_counts.warn integer
result.summary.severity_counts.info integer
result.summary.severity_counts.ok integer
result.summary.actionable_findings integer
result.summary.protocols_offered[] string[]
result.summary.deprecated_protocols[] string[]
result.summary.supports_tls_1_3 boolean | null
result.summary.supports_http2 boolean | null
result.summary.supports_http3 boolean | null
result.sections object
result.sections.pretest[] object[]
result.sections.pretest[] object
result.sections.pretest[].id string
result.sections.pretest[].severity string
result.sections.pretest[].finding string
result.sections.pretest[].cve string
result.sections.pretest[].cwe string
result.sections.protocols[] object[]
result.sections.protocols[] object
result.sections.protocols[].id string
result.sections.protocols[].severity string
result.sections.protocols[].finding string
result.sections.protocols[].cve string
result.sections.protocols[].cwe string
result.sections.server_defaults[] object[]
result.sections.server_defaults[] object
result.sections.server_defaults[].id string
result.sections.server_defaults[].severity string
result.sections.server_defaults[].finding string
result.sections.server_defaults[].cve string
result.sections.server_defaults[].cwe string
result.sections.server_preferences[] object[]
result.sections.server_preferences[] object
result.sections.server_preferences[].id string
result.sections.server_preferences[].severity string
result.sections.server_preferences[].finding string
result.sections.server_preferences[].cve string
result.sections.server_preferences[].cwe string
result.sections.cipher_categories[] object[]
result.sections.cipher_categories[] object
result.sections.cipher_categories[].id string
result.sections.cipher_categories[].severity string
result.sections.cipher_categories[].finding string
result.sections.cipher_categories[].cve string
result.sections.cipher_categories[].cwe string
result.sections.forward_secrecy[] object[]
result.sections.forward_secrecy[] object
result.sections.forward_secrecy[].id string
result.sections.forward_secrecy[].severity string
result.sections.forward_secrecy[].finding string
result.sections.forward_secrecy[].cve string
result.sections.forward_secrecy[].cwe string
result.sections.vulnerabilities[] object[]
result.sections.vulnerabilities[] object
result.sections.vulnerabilities[].id string
result.sections.vulnerabilities[].severity string
result.sections.vulnerabilities[].finding string
result.sections.vulnerabilities[].cve string
result.sections.vulnerabilities[].cwe string
result.sections.browser_simulations[] object[]
result.sections.browser_simulations[] object
result.sections.browser_simulations[].id string
result.sections.browser_simulations[].severity string
result.sections.browser_simulations[].finding string
result.sections.browser_simulations[].cve string
result.sections.browser_simulations[].cwe string
result.sections.rating[] object[]
result.sections.rating[] object
result.sections.rating[].id string
result.sections.rating[].severity string
result.sections.rating[].finding string
result.sections.rating[].cve string
result.sections.rating[].cwe string
result.findings[] object[]
result.findings[] object
result.findings[].section string
result.findings[].id string
result.findings[].severity string
result.findings[].finding string
result.findings[].cve string
result.findings[].cwe string
result.checked_at string
result.scan_duration_ms integer
result.notes[] string[]
error object
error.message string
error.retryable boolean

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN"
const response = await fetch("https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/deep-scan/status?scan_token=SIGNED_TOKEN_FROM_SSL_DEEP_SCAN")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "status": "ready",
  "domain": "openai.com",
  "host": "openai.com",
  "port": 443,
  "profile": "full",
  "scan_token": "eyJrIjoidGxzLWRlZXAtc2NhbiIsImkiOiJleGFtcGxlIiwiaCI6Im9wZW5haS5jb20ifQ",
  "cache": {
    "hit": true,
    "fresh": true,
    "completed_at": "2026-04-18T22:10:00Z",
    "expires_at": "2026-04-19T22:10:00Z",
    "engine": "testssl.sh",
    "profile": "full"
  },
  "result": {
    "domain": "openai.com",
    "host": "openai.com",
    "port": 443,
    "engine": {
      "name": "testssl.sh",
      "mode": "testssl",
      "version": "3.3dev",
      "profile": "full"
    },
    "target": {
      "ip": "172.64.154.211",
      "service": "HTTP",
      "rdns": "--"
    },
    "summary": {
      "severity_counts": {
        "critical": 0,
        "high": 1,
        "medium": 1,
        "low": 0,
        "warn": 1,
        "info": 6,
        "ok": 4
      },
      "actionable_findings": 3,
      "protocols_offered": [
        "TLS1_2",
        "TLS1_3"
      ],
      "deprecated_protocols": [],
      "supports_tls_1_3": true,
      "supports_http2": true,
      "supports_http3": null
    },
    "sections": {
      "pretest": [],
      "protocols": [
        {
          "id": "TLS1_2",
          "severity": "OK",
          "finding": "offered"
        },
        {
          "id": "TLS1_3",
          "severity": "OK",
          "finding": "offered with final"
        },
        {
          "id": "QUIC",
          "severity": "WARN",
          "finding": "not tested due to lack of local OpenSSL support"
        }
      ],
      "server_defaults": [
        {
          "id": "early_data",
          "severity": "HIGH",
          "finding": "supported"
        }
      ],
      "server_preferences": [],
      "cipher_categories": [],
      "forward_secrecy": [],
      "vulnerabilities": [
        {
          "id": "BREACH",
          "severity": "MEDIUM",
          "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
          "cve": "CVE-2013-3587",
          "cwe": "CWE-310"
        }
      ],
      "browser_simulations": [],
      "rating": []
    },
    "findings": [
      {
        "section": "protocols",
        "id": "QUIC",
        "severity": "WARN",
        "finding": "not tested due to lack of local OpenSSL support"
      },
      {
        "section": "server_defaults",
        "id": "early_data",
        "severity": "HIGH",
        "finding": "supported"
      },
      {
        "section": "vulnerabilities",
        "id": "BREACH",
        "severity": "MEDIUM",
        "finding": "potentially VULNERABLE, br gzip HTTP compression detected",
        "cve": "CVE-2013-3587",
        "cwe": "CWE-310"
      }
    ],
    "checked_at": "2026-04-18T22:10:00Z",
    "scan_duration_ms": 53880,
    "notes": []
  }
}

HTTP 状态码

  • 200 成功
  • 202 已接受
  • 400 请求错误
  • 401 未授权
  • 404 未找到
  • 424 HTTP 424
  • 429 请求过多
GET /v1/ssl/grade 积分: 3

查询参数

参数 类型 必需
domain string 必需

响应字段

字段 类型
domain string
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
grade string | null
score integer | null
grade_reason string | null
protocol_support object
protocol_support.tls_1_3 boolean
protocol_support.tls_1_2 boolean
protocol_support.tls_1_1 boolean
protocol_support.tls_1_0 boolean
protocol_support.ssl_3 boolean
protocol_support.preferred_protocol string
protocol_support.detection_method string
certificate object
certificate.subject string
certificate.issuer string
certificate.issuer_org string
certificate.valid_from string
certificate.valid_until string
certificate.days_remaining integer
certificate.expired boolean
certificate.san[] string[]
certificate.key_type string
certificate.key_size integer
certificate.signature_algorithm string
certificate.fingerprint_sha256 string
certificate.serial_number string
chain object
chain.length integer
chain.valid boolean
chain.certificates[] object[]
chain.certificates[] object
chain.certificates[].subject string
chain.certificates[].issuer string
chain.certificates[].type string
chain.certificates[].valid_from string
chain.certificates[].valid_until string
chain.issues[] string[]
security object
security.forward_secrecy boolean
security.forward_secrecy_cipher string
security.hsts_enabled boolean
security.hsts_max_age integer
security.hsts_include_subdomains boolean
security.hsts_preload boolean
security.hsts_header string
security.hsts_preload_status string
security.hsts_preloaded_domain string
security.hsts_preload_eligible boolean
security.hsts_final_url string
security.hsts_errors[] string[]
security.alpn_negotiated string
security.ocsp_stapling boolean
security.ocsp_stapling_fresh boolean
security.ocsp_stapling_status string | null
security.ocsp_stapling_this_update string | null
security.ocsp_stapling_next_update string | null
security.sct_embedded boolean
security.sct_count integer
security.ct_compliance boolean
security.must_staple boolean
security.secure_renegotiation boolean
revocation object
revocation.ocsp object
revocation.ocsp.present boolean
revocation.ocsp.uris[] string[]
revocation.ocsp.checked_uri string | null
revocation.ocsp.status string | null
revocation.ocsp.verify_ok boolean
revocation.ocsp.this_update string | null
revocation.ocsp.next_update string | null
revocation.ocsp.error string | null
revocation.crl object
revocation.crl.present boolean
revocation.crl.uris[] string[]
revocation.crl.checked_uri string | null
revocation.crl.fetched boolean
revocation.crl.http_status integer | null
revocation.crl.revoked boolean | null
revocation.crl.last_update string | null
revocation.crl.next_update string | null
revocation.crl.revoked_serial_count integer | null
revocation.crl.error string | null
grade_delta object
grade_delta.current_grade string | null
grade_delta.score integer | null
grade_delta.next_grade string | null
grade_delta.points_to_next_grade integer | null
grade_delta.top_blockers[] string[]
issues[] string[]
recommendations[] string[]
checked_at string
check_duration_ms integer

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/grade?domain=example.com"
const response = await fetch("https://domscan.net/v1/ssl/grade?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/grade?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/grade?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/grade?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "domain": "cloudflare.com",
  "grade": "A+",
  "score": 98,
  "protocol_support": {
    "tls_1_3": true,
    "tls_1_2": true,
    "tls_1_1": false,
    "tls_1_0": false,
    "ssl_3": false,
    "preferred_protocol": "TLSv1.3",
    "detection_method": "active"
  },
  "certificate": {
    "subject": "cloudflare.com",
    "issuer": "Google Trust Services",
    "valid_from": "2026-03-01T00:00:00Z",
    "valid_until": "2026-05-30T23:59:59Z",
    "days_remaining": 42,
    "expired": false,
    "san": [
      "cloudflare.com",
      "*.cloudflare.com"
    ],
    "key_type": "ECDSA",
    "key_size": 256,
    "signature_algorithm": "ecdsaWithSHA256",
    "fingerprint_sha256": "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
  },
  "chain": {
    "length": 3,
    "valid": true,
    "certificates": [
      {
        "subject": "cloudflare.com",
        "issuer": "Google Trust Services",
        "type": "leaf"
      },
      {
        "subject": "Google Trust Services",
        "issuer": "GlobalSign",
        "type": "intermediate"
      },
      {
        "subject": "GlobalSign",
        "issuer": "GlobalSign",
        "type": "root"
      }
    ],
    "issues": []
  },
  "security": {
    "forward_secrecy": true,
    "forward_secrecy_cipher": "TLS_AES_256_GCM_SHA384",
    "hsts_enabled": true,
    "hsts_max_age": 31536000,
    "hsts_include_subdomains": true,
    "hsts_preload": true,
    "hsts_header": "max-age=31536000; includeSubDomains; preload",
    "hsts_preload_status": "preloaded",
    "hsts_preloaded_domain": "cloudflare.com",
    "hsts_preload_eligible": true,
    "hsts_final_url": "https://cloudflare.com/",
    "hsts_errors": [],
    "alpn_negotiated": "h2",
    "ocsp_stapling": true,
    "ocsp_stapling_fresh": true,
    "ocsp_stapling_status": "successful (0x0)",
    "ocsp_stapling_this_update": "2026-04-15T02:35:16Z",
    "ocsp_stapling_next_update": "2026-04-22T01:35:15Z",
    "ct_compliance": true,
    "must_staple": false,
    "sct_embedded": true,
    "sct_count": 2
  },
  "revocation": {
    "ocsp": {
      "present": true,
      "uris": [
        "http://o.pki.goog/wr2"
      ],
      "checked_uri": "http://o.pki.goog/wr2",
      "status": "good",
      "verify_ok": true,
      "this_update": "2026-04-18T20:30:00Z",
      "next_update": "2026-04-19T20:30:00Z",
      "error": null
    },
    "crl": {
      "present": true,
      "uris": [
        "http://c.pki.goog/wr2.crl"
      ],
      "checked_uri": "http://c.pki.goog/wr2.crl",
      "fetched": true,
      "http_status": 200,
      "revoked": false,
      "last_update": "2026-04-17T00:00:00Z",
      "next_update": "2026-04-24T00:00:00Z",
      "revoked_serial_count": 0,
      "error": null
    }
  },
  "grade_delta": {
    "current_grade": "A+",
    "score": 98,
    "next_grade": null,
    "points_to_next_grade": null,
    "top_blockers": []
  },
  "issues": [],
  "recommendations": [],
  "checked_at": "2026-04-18T21:00:00Z",
  "check_duration_ms": 142
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多
GET /v1/ssl/chain 积分: 3

查询参数

参数 类型 必需
domain string 必需

响应字段

字段 类型
domain string
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
chain[] object[]
chain[] object
chain[].subject string
chain[].issuer string
chain[].type string
chain[].valid_from string | null
chain[].valid_until string | null
chain_length integer
root_trusted boolean
chain_valid boolean
certificate object
certificate.subject string
certificate.issuer string
certificate.issuer_org string
certificate.valid_from string
certificate.valid_until string
certificate.days_remaining integer
certificate.expired boolean
certificate.san[] string[]
certificate.key_type string
certificate.key_size integer
certificate.signature_algorithm string
certificate.fingerprint_sha256 string
certificate.serial_number string
protocol_support object
protocol_support.tls_1_3 boolean
protocol_support.tls_1_2 boolean
protocol_support.tls_1_1 boolean
protocol_support.tls_1_0 boolean
protocol_support.ssl_3 boolean
protocol_support.preferred_protocol string
protocol_support.detection_method string
security object
security.alpn_negotiated string
security.forward_secrecy boolean
security.forward_secrecy_cipher string
security.must_staple boolean
security.sct_embedded boolean
security.sct_count integer
security.ocsp_stapling boolean
security.ocsp_stapling_fresh boolean
security.ocsp_stapling_status string | null
security.ocsp_stapling_this_update string | null
security.ocsp_stapling_next_update string | null
issues[] string[]
remediation_hints[] string[]
revocation object
revocation.ocsp object
revocation.ocsp.present boolean
revocation.ocsp.uris[] string[]
revocation.ocsp.checked_uri string | null
revocation.ocsp.status string | null
revocation.ocsp.verify_ok boolean
revocation.ocsp.this_update string | null
revocation.ocsp.next_update string | null
revocation.ocsp.error string | null
revocation.crl object
revocation.crl.present boolean
revocation.crl.uris[] string[]
revocation.crl.checked_uri string | null
revocation.crl.fetched boolean
revocation.crl.http_status integer | null
revocation.crl.revoked boolean | null
revocation.crl.last_update string | null
revocation.crl.next_update string | null
revocation.crl.revoked_serial_count integer | null
revocation.crl.error string | null
checked_at string

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/chain?domain=example.com"
const response = await fetch("https://domscan.net/v1/ssl/chain?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/chain?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/chain?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/chain?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "domain": "cloudflare.com",
  "chain": [
    {
      "subject": "cloudflare.com",
      "issuer": "Google Trust Services",
      "type": "leaf",
      "valid_from": "2026-03-01T00:00:00Z",
      "valid_until": "2026-05-30T23:59:59Z"
    },
    {
      "subject": "Google Trust Services",
      "issuer": "GlobalSign",
      "type": "intermediate",
      "valid_from": "2024-01-01T00:00:00Z",
      "valid_until": "2029-01-01T00:00:00Z"
    }
  ],
  "chain_valid": true,
  "chain_length": 2,
  "root_trusted": true,
  "certificate": {
    "subject": "cloudflare.com",
    "issuer": "Google Trust Services",
    "valid_from": "2026-03-01T00:00:00Z",
    "valid_until": "2026-05-30T23:59:59Z",
    "days_remaining": 42,
    "expired": false,
    "san": [
      "cloudflare.com",
      "*.cloudflare.com"
    ],
    "key_type": "ECDSA",
    "key_size": 256,
    "signature_algorithm": "ecdsaWithSHA256",
    "fingerprint_sha256": "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
  },
  "protocol_support": {
    "tls_1_3": true,
    "tls_1_2": true,
    "tls_1_1": false,
    "tls_1_0": false,
    "ssl_3": false,
    "preferred_protocol": "TLSv1.3",
    "detection_method": "active"
  },
  "security": {
    "alpn_negotiated": "h2",
    "forward_secrecy": true,
    "forward_secrecy_cipher": "TLS_AES_256_GCM_SHA384",
    "must_staple": false,
    "sct_embedded": true,
    "sct_count": 2,
    "ocsp_stapling": true,
    "ocsp_stapling_fresh": true,
    "ocsp_stapling_status": "successful (0x0)",
    "ocsp_stapling_this_update": "2026-04-15T02:35:16Z",
    "ocsp_stapling_next_update": "2026-04-22T01:35:15Z"
  },
  "issues": [],
  "remediation_hints": [],
  "revocation": {
    "ocsp": {
      "present": true,
      "uris": [
        "http://o.pki.goog/wr2"
      ],
      "checked_uri": "http://o.pki.goog/wr2",
      "status": "good",
      "verify_ok": true,
      "this_update": "2026-04-18T20:30:00Z",
      "next_update": "2026-04-19T20:30:00Z",
      "error": null
    },
    "crl": {
      "present": true,
      "uris": [
        "http://c.pki.goog/wr2.crl"
      ],
      "checked_uri": "http://c.pki.goog/wr2.crl",
      "fetched": true,
      "http_status": 200,
      "revoked": false,
      "last_update": "2026-04-17T00:00:00Z",
      "next_update": "2026-04-24T00:00:00Z",
      "revoked_serial_count": 0,
      "error": null
    }
  },
  "checked_at": "2026-04-18T21:00:00Z"
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多
GET /v1/ssl/expiring 积分: 1

查询参数

参数 类型 必需
domain string 必需
days integer
默认值 30
可选
threshold_days integer 可选

响应字段

字段 类型
domain string
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
certificate_status string
expiring_soon boolean
expired boolean
days_remaining integer
valid_from string
valid_until string
subject string
issuer string
urgency string
recommendation string
checked_at string

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1"
const response = await fetch("https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/ssl/expiring?domain=example.com&days=30&threshold_days=1")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "domain": "example.com",
  "certificate_status": "found",
  "expiring_soon": true,
  "expired": false,
  "days_remaining": 25,
  "valid_from": "2026-08-05T08:12:44Z",
  "valid_until": "2026-11-03T08:12:43Z",
  "subject": "/CN=www.example.com",
  "issuer": "/C=US/O=Let's Encrypt/CN=R11",
  "urgency": "notice",
  "recommendation": "Certificate expires in 25 days - plan renewal",
  "checked_at": "2026-10-09T10:15:30.000Z"
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多
POST /v1/certificates/bulk 积分: 2/item

查询参数

参数 类型 必需
dry_run string
允许的值 true
可选

正文参数

参数 类型 必需
domains string[] 必需
include_subdomains boolean
默认值 true
可选
include_expired boolean
默认值 false
可选
limit integer
默认值 100
可选

响应字段

字段 类型
results[] unknown[]
meta object
meta.total integer
meta.succeeded integer
meta.failed integer
meta.max_items integer
meta.credits_per_item integer
meta.duration_ms integer

请求示例

curl -X POST "https://domscan.net/v1/certificates/bulk" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "domains": [
    "example.com",
    "cloudflare.com"
  ],
  "include_subdomains": true,
  "limit": 100
}'
const response = await fetch("https://domscan.net/v1/certificates/bulk", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "domains": [
      "example.com",
      "cloudflare.com"
    ],
    "include_subdomains": true,
    "limit": 100
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/certificates/bulk",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "domains": [
            "example.com",
            "cloudflare.com",
        ],
        "include_subdomains": True,
        "limit": 100,
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "domains": [
	    "example.com",
	    "cloudflare.com"
	  ],
	  "include_subdomains": true,
	  "limit": 100
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/certificates/bulk", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/certificates/bulk")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
  "domains" => [
    "example.com",
    "cloudflare.com"
  ],
  "include_subdomains" => true,
  "limit" => 100
})

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "results": [
    {
      "input": "example",
      "data": {}
    }
  ],
  "meta": {
    "total": 1,
    "succeeded": 1,
    "failed": 1,
    "max_items": 10,
    "credits_per_item": 1,
    "duration_ms": 1
  }
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 409 HTTP 409
  • 422 HTTP 422
  • 429 请求过多
GET /v1/headers 积分: 1

查询参数

参数 类型 必需
url string 可选
domain string 可选

响应字段

字段 类型
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
url string
domain string
status string
checked_at string
final_url string | null
http_status integer | null
redirect_count integer | null
https boolean | null
score integer | null
grade string | null
summary object
summary.passed integer
summary.warned integer
summary.failed integer
summary.missing integer
summary.not_applicable integer
summary.hsts_preload_ready boolean
summary.csp_strict boolean
checks[] object[]
checks[] object
checks[].id string
checks[].status string
checks[].value string | null
checks[].detail_code string
checks[].issues[] string[]
checks[].weight integer
checks[].classification object
checks[].classification.status string
checks[].classification.reason string
checks[].classification.evidence object
checks[].classification.evidence.source string
checks[].classification.evidence.method string
checks[].classification.evidence.observed_at string
checks[].classification.evidence.detail string
checks[].classification.checked_at string
cookies[] object[]
cookies[] object
cookies[].name string
cookies[].secure boolean
cookies[].http_only boolean
cookies[].same_site string | null
cookies[].issues[] string[]
headers_raw object
recommendations[] string[]
fetch object
fetch.checked_url string
fetch.http_status integer | null
fetch.final_url string | null
fetch.via_proxy boolean | null
fetch.redirect_count integer | null
fetch.unknown_reason string | null
caveats[] string[]
rubric_version string

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com"
const response = await fetch("https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/headers?url=https%3A%2F%2Fexample.com&domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "url": "https://example.com/",
  "domain": "example.com",
  "status": "ok",
  "checked_at": "2026-10-09T10:15:30.000Z",
  "final_url": "https://www.example.com/",
  "http_status": 200,
  "redirect_count": 1,
  "https": true,
  "score": 75,
  "grade": "C",
  "summary": {
    "passed": 6,
    "warned": 2,
    "failed": 0,
    "missing": 2,
    "not_applicable": 1,
    "hsts_preload_ready": false,
    "csp_strict": false
  },
  "checks": [
    {
      "id": "strict_transport_security",
      "status": "pass",
      "value": "max-age=31536000",
      "detail_code": "enabled",
      "issues": [
        "include_subdomains_missing",
        "preload_missing"
      ],
      "weight": 20
    },
    {
      "id": "content_security_policy",
      "status": "warn",
      "value": "default-src 'self'; script-src 'self' 'unsafe-inline'",
      "detail_code": "unsafe_inline",
      "issues": [
        "missing_object_src",
        "missing_base_uri",
        "unsafe_inline"
      ],
      "weight": 25
    },
    {
      "id": "clickjacking",
      "status": "pass",
      "value": "SAMEORIGIN",
      "detail_code": "x_frame_options_sameorigin",
      "issues": [],
      "weight": 10
    },
    {
      "id": "x_content_type_options",
      "status": "pass",
      "value": "nosniff",
      "detail_code": "nosniff",
      "issues": [],
      "weight": 10
    },
    {
      "id": "referrer_policy",
      "status": "pass",
      "value": "strict-origin-when-cross-origin",
      "detail_code": "strict_origin_when_cross_origin",
      "issues": [],
      "weight": 10
    },
    {
      "id": "permissions_policy",
      "status": "missing",
      "value": null,
      "detail_code": "header_missing",
      "issues": [],
      "weight": 5
    },
    {
      "id": "cross_origin_opener_policy",
      "status": "pass",
      "value": "same-origin",
      "detail_code": "same_origin",
      "issues": [],
      "weight": 5
    },
    {
      "id": "cross_origin_embedder_policy",
      "status": "not_applicable",
      "value": null,
      "detail_code": "not_set_informational",
      "issues": [],
      "weight": 0
    },
    {
      "id": "cross_origin_resource_policy",
      "status": "missing",
      "value": null,
      "detail_code": "header_missing",
      "issues": [],
      "weight": 5
    },
    {
      "id": "information_disclosure",
      "status": "warn",
      "value": "server: nginx/1.25.3",
      "detail_code": "version_disclosed",
      "issues": [
        "server_version_disclosed"
      ],
      "weight": 5
    },
    {
      "id": "cookies",
      "status": "pass",
      "value": "session",
      "detail_code": "all_flags_set",
      "issues": [],
      "weight": 5
    }
  ],
  "cookies": [
    {
      "name": "session",
      "secure": true,
      "http_only": true,
      "same_site": "lax",
      "issues": []
    }
  ],
  "headers_raw": {
    "strict-transport-security": "max-age=31536000",
    "content-security-policy": "default-src 'self'; script-src 'self' 'unsafe-inline'",
    "x-frame-options": "SAMEORIGIN",
    "x-content-type-options": "nosniff",
    "referrer-policy": "strict-origin-when-cross-origin",
    "cross-origin-opener-policy": "same-origin",
    "server": "nginx/1.25.3"
  },
  "recommendations": [
    "remove_csp_unsafe_inline",
    "add_csp_object_src_none",
    "add_csp_base_uri",
    "add_hsts_include_subdomains",
    "add_hsts_preload",
    "add_permissions_policy",
    "add_cross_origin_resource_policy",
    "hide_server_version"
  ],
  "fetch": {
    "checked_url": "https://example.com/",
    "http_status": 200,
    "final_url": "https://www.example.com/",
    "via_proxy": true,
    "redirect_count": 1,
    "unknown_reason": null
  },
  "caveats": [
    "set_cookie_visibility_limited",
    "meta_csp_not_evaluated"
  ],
  "rubric_version": "2026-10-09.1"
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多
  • 502 网关错误
GET /v1/security-txt 积分: 1

查询参数

参数 类型 必需
domain string 可选
url string 可选

响应字段

字段 类型
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
domain string
status string
location string | null
checked_at string
fetch[] object[]
fetch[] object
fetch[].location string
fetch[].checked_url string
fetch[].http_status integer | null
fetch[].final_url string | null
fetch[].via_proxy boolean | null
fetch[].content_type string | null
fetch[].bytes integer | null
fetch[].truncated boolean
fetch[].outcome string
fetch[].error string | null
fields object
fields.contact[] string[]
fields.expires string | null
fields.expires_in_days integer | null
fields.encryption[] string[]
fields.acknowledgments[] string[]
fields.preferred_languages[] string[]
fields.canonical[] string[]
fields.policy[] string[]
fields.hiring[] string[]
fields.csaf[] string[]
fields.other_fields[] object[]
fields.other_fields[] object
fields.other_fields[].name string
fields.other_fields[].value string
signed boolean
issues[] object[]
issues[] object
issues[].code string
issues[].severity string
issues[].field string | null
caveats[] string[]

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com"
const response = await fetch("https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/security-txt?domain=example.com&url=https%3A%2F%2Fexample.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "domain": "example.com",
  "status": "valid",
  "location": "well_known",
  "checked_at": "2026-10-09T10:00:00.000Z",
  "fetch": [
    {
      "location": "well_known",
      "checked_url": "https://example.com/.well-known/security.txt",
      "http_status": 200,
      "final_url": "https://example.com/.well-known/security.txt",
      "via_proxy": true,
      "content_type": "text/plain; charset=utf-8",
      "bytes": 279,
      "truncated": false,
      "outcome": "found",
      "error": null
    }
  ],
  "fields": {
    "contact": [
      "mailto:[email protected]",
      "https://example.com/report"
    ],
    "expires": "2027-01-01T00:00:00.000Z",
    "expires_in_days": 83,
    "encryption": [
      "https://example.com/pgp-key.txt"
    ],
    "acknowledgments": [],
    "preferred_languages": [
      "en",
      "es"
    ],
    "canonical": [
      "https://example.com/.well-known/security.txt"
    ],
    "policy": [
      "https://example.com/security-policy"
    ],
    "hiring": [],
    "csaf": [],
    "other_fields": []
  },
  "signed": false,
  "issues": [],
  "caveats": []
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多
  • 502 网关错误
GET /v1/security-rating 积分: 5

查询参数

参数 类型 必需
domain string 必需

响应字段

字段 类型
domain string
status string
score integer | null
grade string | null
checks_unknown integer
score_confidence string
weight_covered integer
capped_by_critical_finding boolean
categories[] object[]
categories[] object
categories[].id string
categories[].status string
categories[].score integer | null
categories[].weight integer
categories[].unknown_reason string | null
categories[].findings[] object[]
categories[].findings[] object
categories[].findings[].code string
categories[].findings[].severity string
findings[] object[]
findings[] object
findings[].category string
findings[].code string
findings[].severity string
sources object
sources.tls object
sources.tls.grade string | null
sources.tls.score integer | null
sources.tls.checked_at string
sources.http_headers object
sources.http_headers.status string
sources.http_headers.grade string | null
sources.http_headers.score integer | null
sources.http_headers.final_url string | null
sources.http_headers.http_status integer | null
sources.dns_security object
sources.dns_security.score integer | null
sources.dns_security.grade string | null
sources.dns_security.checks_unknown integer
sources.dns_security.blocklists_checked integer
sources.dns_security.blocklists_unknown integer
sources.security_txt object
sources.security_txt.status string
sources.security_txt.location string | null
checked_at string
duration_ms integer
rating_version string
caveats[] string[]

请求示例

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/security-rating?domain=example.com"
const response = await fetch("https://domscan.net/v1/security-rating?domain=example.com", {
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.get(
    "https://domscan.net/v1/security-rating?domain=example.com",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/security-rating?domain=example.com", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(resp.Status, string(data))
}
require "json"
require "net/http"

uri = URI("https://domscan.net/v1/security-rating?domain=example.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))

响应示例

{
  "domain": "github.com",
  "status": "partial",
  "score": 81,
  "grade": "B",
  "checks_unknown": 1,
  "score_confidence": "medium",
  "weight_covered": 85,
  "capped_by_critical_finding": false,
  "categories": [
    {
      "id": "tls",
      "status": "scored",
      "score": 85,
      "weight": 30,
      "unknown_reason": null,
      "findings": []
    },
    {
      "id": "http_headers",
      "status": "scored",
      "score": 85,
      "weight": 20,
      "unknown_reason": null,
      "findings": [
        {
          "code": "header_permissions_policy_missing",
          "severity": "info"
        },
        {
          "code": "header_cross_origin_opener_policy_missing",
          "severity": "info"
        },
        {
          "code": "header_cross_origin_resource_policy_missing",
          "severity": "info"
        }
      ]
    },
    {
      "id": "email_authentication",
      "status": "scored",
      "score": 85,
      "weight": 20,
      "unknown_reason": null,
      "findings": []
    },
    {
      "id": "dns",
      "status": "scored",
      "score": 40,
      "weight": 10,
      "unknown_reason": null,
      "findings": [
        {
          "code": "dnssec_not_enabled",
          "severity": "low"
        }
      ]
    },
    {
      "id": "reputation",
      "status": "unknown",
      "score": null,
      "weight": 15,
      "unknown_reason": "no_evidence",
      "findings": []
    },
    {
      "id": "disclosure",
      "status": "scored",
      "score": 100,
      "weight": 5,
      "unknown_reason": null,
      "findings": []
    }
  ],
  "findings": [
    {
      "category": "dns",
      "code": "dnssec_not_enabled",
      "severity": "low"
    },
    {
      "category": "http_headers",
      "code": "header_permissions_policy_missing",
      "severity": "info"
    },
    {
      "category": "http_headers",
      "code": "header_cross_origin_opener_policy_missing",
      "severity": "info"
    },
    {
      "category": "http_headers",
      "code": "header_cross_origin_resource_policy_missing",
      "severity": "info"
    }
  ],
  "sources": {
    "tls": {
      "grade": "A",
      "score": 85,
      "checked_at": "2026-10-18T04:14:57.278Z"
    },
    "http_headers": {
      "status": "ok",
      "grade": "B",
      "score": 85,
      "final_url": "https://github.com/",
      "http_status": 200
    },
    "dns_security": {
      "score": 70,
      "grade": "B",
      "checks_unknown": 0,
      "blocklists_checked": 3,
      "blocklists_unknown": 1
    },
    "security_txt": {
      "status": "valid",
      "location": "well_known"
    }
  },
  "checked_at": "2026-10-18T04:14:58.507Z",
  "duration_ms": 2114,
  "rating_version": "2026-10-18.1",
  "caveats": [
    "passive_checks_only",
    "not_a_penetration_test",
    "tls_protocols_inferred",
    "unknown_categories_excluded_from_score"
  ]
}

HTTP 状态码

  • 200 成功
  • 400 请求错误
  • 401 未授权
  • 402 需要付款
  • 429 请求过多