/** 공개 키·인증서를 제공하는 곳 (사설 IP용 와일드카드) */ export declare const LAN_TLS_ORIGIN = "https://local-ip.sh"; export declare const LAN_TLS_DOMAIN = "local-ip.sh"; /** * `192.168.0.10` → `192-168-0-10.local-ip.sh`. * * 점을 대시로 바꾸는 이유: 와일드카드 인증서는 **한 레이블만** 덮는다 * (`*.local-ip.sh`는 `1.2.3.4.local-ip.sh`를 덮지 못한다). */ export declare function lanTlsHostname(ip: string): string; /** PEM에서 만료 시각 — 헤더 파싱 없이 인증서 자체를 읽는다 */ export declare function certExpiry(pem: string): Date | undefined; /** 캐시된 인증서를 계속 써도 되는지 */ export declare function isUsable(pem: string, now: Date): boolean; export interface LanTlsMaterial { cert: string; key: string; hostname: string; /** 이번에 새로 받아왔는지 — 사람에게 알릴 때만 쓴다 */ fetched: boolean; } /** * 인증서·키를 확보한다. 캐시가 유효하면 그것, 아니면 받아서 캐시한다. * * 번들하지 않는 이유: 이 인증서는 90일 주기로 갱신된다. 릴리스에 넣으면 곧 **만료된 * 인증서를 배포**하게 되고, 그러면 사용자는 "왜 안 붙지"를 만나며 원인은 우리 릴리스 날짜다. */ export declare function ensureLanTls(ip: string, now?: Date, fetchPem?: (url: string) => Promise): Promise; /** * 이 네트워크에서 그 호스트명이 **우리 IP로** 해석되는지 확인한다. * * 왜 반드시 확인하는가: 사설 IP를 돌려주는 공개 DNS 응답을 **차단하는 리졸버가 흔하다** * (DNS rebinding 방어 — 사내망·일부 공유기의 기본값이다). 그 경우 이름이 해석되지 않거나 * 엉뚱한 곳을 가리키고, 사용자는 원인 없이 "왜 안 붙지"를 만난다. 이 라이브러리를 쓰는 * 사람의 네트워크는 내 것과 다르다 — 되는지 확인하고, 안 되면 이유를 말해야 한다. */ export declare function resolvesToSelf(hostname: string, expectedIp: string): Promise; /** DNS가 막혔을 때 사람에게 줄 설명 — 막다른 길로 두지 않는다 */ export declare function dnsBlockedMessage(hostname: string, ip: string): string;