CSR.plus API 참조
하나의 개방형 REST API로 SSL/TLS 인증서 수명 주기 전체를 자동화 — CSR 생성, 디코딩, A–F 등급, 인증서 투명성, CAA, 폐기 및 TLS 추적. 무료, 인증 불필요, API 키 불필요.
API 라이브 체험개요
CSR.plus API는 웹 도구를 구동하는 읽기 전용 및 생성 엔드포인트 모음입니다. 모든 엔드포인트는 JSON을 반환하고, 브라우저 클라이언트용 CORS를 지원하며, IP 주소별로 속도가 제한됩니다. 키와 CSR은 메모리에서만 생성되며 저장되지 않습니다.
기본 URL 및 인증
https://csr.plus모든 엔드포인트는 HTTPS로 제공됩니다. 인증이 필요하지 않습니다 — API는 설계상 개방형이며 인증이 없습니다. API 키, 토큰, 청구가 없습니다. 요청은 속도 제한을 위해서만 IP 주소로 식별됩니다.
모든 응답에 CORS 헤더(Access-Control-Allow-Origin: *)가 포함되므로 브라우저와 클라이언트 측 스크립트에서 직접 API를 호출할 수 있습니다.
속도 제한
| 엔드포인트 | 제한 | 기간 |
|---|---|---|
| /api/generate | 10회 요청 | IP당 분당 |
| /api/ssl-check, /api/ct, /api/caa | 30회 요청 | IP당 분당 |
| /api/revocation, /api/ssl-tracer | 20회 요청 | IP당 분당 |
| /api/decode, /api/openssl-trace | 제한 없음 | — |
제한을 초과하면 대기할 시간(초)을 알려주는 Retry-After 헤더와 함께 HTTP 429가 반환됩니다.
/api/generate인증서 서명 요청과 개인 키를 생성합니다. 속도 제한: IP당 분당 10회 요청.
요청 본문
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| common_name | string | 예 | 기본 도메인 (예: example.com) |
| sans | array | 아니요 | 추가 주체 대체 이름 (예: ["www.example.com"]) |
| organization | string | 아니요 | 조직 이름 (O) |
| org_unit | string | 아니요 | 조직 단위 (OU) |
| country | string | 아니요 | 두 글자 국가 코드 (C) (예: "US") |
| state | string | 아니요 | 주 또는 도 (ST) |
| locality | string | 아니요 | 지역 / 도시 (L) |
| string | 아니요 | 연락처 이메일 주소 | |
| key_type | string | 아니요 | "rsa" (기본값) 또는 "ecdsa" |
| key_size | string|int | 아니요 | RSA: 2048(기본값) / 3072 / 4096 · ECDSA: "P-256"(기본값) / "P-384" |
| passphrase | string | 아니요 | 개인 키를 암호화된 PKCS#8 PEM으로 암호화 (최대 200자) |
응답 필드
| 필드 | 설명 |
|---|---|
| csr | PEM 형식의 인증서 서명 요청 (PKCS#10, SHA-256 서명) |
| private_key | PEM 형식의 개인 키 (PKCS#8; passphrase 지정 시 암호화된 PKCS#8) |
| algorithm | 사용된 알고리즘 (예: "RSA-2048" 또는 "ECDSA-P-256") |
| created_at | 생성 시각의 ISO 8601 타임스탬프 |
curl -X POST https://csr.plus/api/generate \
-H "Content-Type: application/json" \
-d '{
"common_name": "example.com",
"sans": ["www.example.com", "api.example.com"],
"organization": "Example Inc",
"country": "US",
"key_type": "rsa",
"key_size": 2048
}'{
"csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIICzDCCAbQCAQAwgYwxCzAJBgNVBAYTAVVT...\n-----END CERTIFICATE REQUEST-----",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASC...\n-----END PRIVATE KEY-----",
"algorithm": "RSA-2048",
"created_at": "2026-08-14T10:30:00.000Z"
}openssl req -verify -noout -in example.com.csr
openssl req -in example.com.csr -text -noout | head -20/api/decode모든 PKCS#10 CSR을 구문 분석하고 주체, 주체 대체 이름, 공개 키, 서명 검증 및 확장을 반환합니다.
요청 본문
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| csr | string | 예 | PEM 형식의 CSR (-----BEGIN CERTIFICATE REQUEST-----) |
curl -X POST https://csr.plus/api/decode \
-H "Content-Type: application/json" \
-d '{"csr": "-----BEGIN CERTIFICATE REQUEST-----\n..."}'{
"success": true,
"subject": {
"commonName": "example.com",
"organization": "Example Inc",
"organizationalUnit": null,
"country": "US",
"state": "California",
"locality": "San Francisco",
"email": null
},
"publicKey": { "type": "RSA", "size": 2048 },
"signature": { "algorithm": "sha256WithRSAEncryption", "verified": true },
"sanList": ["example.com", "www.example.com", "api.example.com"],
"extensions": [],
"size": 640,
"version": 0,
"timestamp": "2026-08-14T10:30:00.000Z"
}참고: dcvInfo에는 CA 검증 단계 완료에 유용한 도메인 제어 검증 힌트(HTTP 토큰 파일과 CNAME 레코드)가 포함됩니다.
/api/ssl-check?domain={domain}SSL Labs 스타일 A–F 등급의 전체 SSL/TLS 검사: 인증서 유효성, 호스트 이름 일치, 체인 신뢰, TLS 버전 프로브 및 HSTS 검사.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| domain | string | 예 | 검사할 호스트 이름 (포트 443 가정) |
curl "https://csr.plus/api/ssl-check?domain=example.com"{
"success": true,
"domain": "example.com",
"grade": {
"letter": "A+",
"score": 100,
"label": "Excellent configuration with HSTS",
"checks": [
{ "name": "Hostname match", "status": "pass", "detail": "Certificate covers the requested hostname" },
{ "name": "TLS 1.3", "status": "pass", "detail": "TLS 1.3 is supported" }
]
},
"cert": {
"subject": "CN=example.com",
"issuer": "CN=R10,O=Let's Encrypt,C=US",
"validFrom": "2026-05-14T00:00:00.000Z",
"validTo": "2026-08-12T00:00:00.000Z",
"daysRemaining": 30,
"san": ["example.com", "www.example.com"]
},
"tls": { "tls13": true, "tls12": true, "tls11": false, "tls10": false, "protocol": "TLSv1.3" },
"hsts": { "present": true, "maxAge": 31536000, "includeSubDomains": true, "preload": false }
}/api/ct?domain={domain}도메인에 발급된 모든 인증서를 공개 인증서 투명성 로그에서 검색합니다. crt.sh를 사용할 수 없으면 Cert Spotter로 대체됩니다.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| domain | string | 예 | CT 로그에서 검색할 도메인 |
curl "https://csr.plus/api/ct?domain=example.com"{
"success": true,
"count": 12,
"source": "crt.sh",
"certs": [
{
"id": 123456,
"logged_at": "2026-08-01T12:00:00.000Z",
"not_before": "2026-07-15T00:00:00.000Z",
"not_after": "2026-10-13T00:00:00.000Z",
"common_name": "example.com",
"name_value": "example.com\nwww.example.com"
}
]
}응답에 source(crt.sh 또는 certspotter)가 포함되어 데이터를 제공한 공급자를 알 수 있습니다.
/api/caa?domain={domain}도메인의 DNS CAA 레코드와 A, AAAA, NS, MX 레코드를 반환하여 인증서 발급이 허가된 인증 기관을 표시합니다.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| domain | string | 예 | 조회할 도메인 |
curl "https://csr.plus/api/caa?domain=example.com"{
"success": true,
"domain": "example.com",
"caa": [
{ "flags": 0, "tag": "issue", "value": "letsencrypt.org" },
{ "flags": 0, "tag": "iodef", "value": "mailto:[email protected]" }
],
"a": ["93.184.216.34"],
"aaaa": ["2606:2800:220:1:248:1893:25c8:1946"],
"ns": ["a.iana-servers.net"],
"mx": [],
"caaError": ""
}/api/revocation?domain={domain}도메인이 현재 제공하는 인증서를 가져와 CRL 배포 지점과 OCSP 응답자 엔드포인트를 보고합니다.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| domain | string | 예 | 서비스 중인 인증서를 검사할 도메인 |
curl "https://csr.plus/api/revocation?domain=example.com"{
"success": true,
"domain": "example.com",
"serial": "03F2A1B3C4D5E6F7",
"crlUrls": ["http://crl.letsencrypt.org/r3.crl"],
"ocspUrls": ["http://r3.o.lencr.org"],
"status": "good"
}/api/ssl-tracer?domain={domain}&port={port}모든 호스트와 포트에 대해 실제 TLS 핸드셰이크를 수행하고 DNS 해석, TCP 연결, 협상된 TLS 버전·암호, 전체 인증서 체인을 기록합니다.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| domain | string | 예 | 연결할 호스트 이름 |
| port | int | 아니요 | TCP 포트 (기본값 443) |
curl "https://csr.plus/api/ssl-tracer?domain=example.com&port=443"{
"success": true,
"host": "example.com",
"port": 443,
"dns": { "ips": ["93.184.216.34"], "ms": 12 },
"tcp": { "ok": true, "ms": 38 },
"tls": { "version": "TLSv1.3", "cipher": "TLS_AES_128_GCM_SHA256", "weak": false },
"certs": [
{
"subject": { "CN": "example.com" },
"issuer": { "CN": "R10", "O": "Let's Encrypt", "C": "US" },
"serialNumber": "03F2A1B3C4D5E6F7",
"notBefore": "2026-05-14T00:00:00.000Z",
"notAfter": "2026-08-12T00:00:00.000Z",
"daysRemaining": 30,
"expired": false,
"isCA": false,
"isSelfSigned": false,
"keyType": "RSA",
"keySize": 2048,
"sha256": "E8:2F:0A:..."
}
],
"chainComplete": true,
"chainNote": "Chain resolves to a trusted root",
"errors": []
}/api/openssl-trace?domain={domain}도메인에 대해 원시 openssl s_client 핸드셰이크를 실행하고 전체 상세 출력을 반환합니다 — 인증서 체인 및 프로토콜 문제 디버깅에 유용합니다.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
| domain | string | 예 | 추적할 도메인 (포트 443 가정) |
curl "https://csr.plus/api/openssl-trace?domain=example.com"{
"success": true,
"output": "CONNECTED(00000005)\ndepth=2 C=US, O=Internet Security Research Group...\nverify return:1\n..."
}오류 코드
오류는 JSON으로 반환되며 error 메시지와, 해당되는 경우 프로그래밍 방식 처리를 위한 errorId가 포함됩니다.
| 상태 | errorId | 의미 |
|---|---|---|
| 400 | invalid_json | 요청 본문이 유효한 JSON이 아닙니다 |
| 400 | invalid_common_name | common_name이 없거나 253자를 초과합니다 |
| 400 | invalid_key_type | key_type은 "rsa" 또는 "ecdsa"여야 합니다 |
| 400 | invalid_key_size | RSA 크기는 2048/3072/4096, ECDSA 곡선은 "P-256"/"P-384"여야 합니다 |
| 400 | invalid_passphrase | passphrase는 비어 있지 않은 문자열(최대 200자)이어야 합니다 |
| 400 | invalid_json_format | 요청 본문 또는 필드 형식이 잘못되었습니다 |
| 405 | method_not_allowed | /api/generate는 POST만 허용합니다 |
| 413 | payload_too_large | 요청 본문이 너무 큽니다 (제한 10KB) |
| 429 | rate_limit_exceeded | 속도 제한 초과 — Retry-After 헤더 이후 재시도하세요 |
| 500 | generation_failed | 키/CSR 생성 중 내부 오류 |
모범 사례
- 프로덕션 환경에서는 OpenSSL 또는 node-forge로 개인 키를 로컬에서 생성하세요. API는 개발, 테스트 및 가벼운 자동화를 위해 설계되었습니다.
- 키를 시스템 간에 저장하거나 전송해야 하는 경우 passphrase를 설정하세요.
- 규정 준수 요구가 없는 한 RSA 2048 또는 ECDSA P-256을 사용하세요.
- 429 후 API를 연타하지 말고 Retry-After 헤더를 준수하세요.
- 읽기 전용 엔드포인트 호출 전에 클라이언트 측에서 domain 매개변수를 검증하세요(최대 253자, 영숫자, 점과 대시).
- API 응답의 private_key 필드를 로그에 기록하지 마세요.
추가 예시
import requests
r = requests.post(
"https://csr.plus/api/generate",
json={"common_name": "example.com", "sans": ["www.example.com"]},
)
r.raise_for_status()
data = r.json()
open("example.com.csr", "w").write(data["csr"])
open("example.com.key", "w").write(data["private_key"])const res = await fetch("https://csr.plus/api/generate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ common_name: "example.com", key_type: "ecdsa", key_size: "P-256" }),
});
const { csr, private_key } = await res.json();
console.log(csr);API 라이브 체험
엔드포인트를 선택하고 파라미터를 입력해 프로덕션 API에 실제 요청을 보냅니다.
자주 묻는 질문
API 속도 제한은 어떻게 되나요?
CSR 생성은 IP 주소당 분당 10회입니다. SSL 검사, CT, CAA는 분당 30회, 폐기 및 TLS 트레이서는 분당 20회입니다. 제한 초과 시 Retry-After 헤더와 함께 HTTP 429가 반환됩니다.
지원되는 키 유형은?
RSA 2048/3072/4096 및 ECDSA P-256/P-384입니다. 요청 본문에 key_type과 key_size 매개변수를 전달하세요.
생성된 개인 키를 암호화할 수 있나요?
네. 요청에 passphrase 필드를 추가하면 개인 키가 암호화된 PKCS#8 PEM 키로 반환됩니다.
API가 제 개인 키를 저장하나요?
아니요. 키와 CSR은 메모리에서 생성되며 저장, 기록 또는 디스크에 남지 않습니다. 개발 및 테스트용으로 사용하세요.
이 API가 생성한 CSR을 어떤 CA가 수락하나요?
이 API는 SHA-256 서명이 있는 표준 PKCS#10 CSR을 생성하며 Let’s Encrypt, DigiCert, Sectigo, Google Trust Services를 포함한 모든 주요 인증 기관이 수락합니다.