Notice
Recent Posts
Recent Comments
Link
투케이2K
549. (javaScript) 자바스크립트 node-forge 라이브러리 사용해 X.509 인증서 식별 정보 확인 - getSha256Fingerprint 본문
JavaScript
549. (javaScript) 자바스크립트 node-forge 라이브러리 사용해 X.509 인증서 식별 정보 확인 - getSha256Fingerprint
투케이2K 2026. 6. 6. 10:25728x90
반응형
[개발 환경 설정]
개발 툴 : Edit++ / Vscode
개발 언어 : JavaScript

[소스 코드]
-----------------------------------------------------------------------------------------
[사전 설명 및 설정 사항]
-----------------------------------------------------------------------------------------
- 개발 환경 : Web
- 개발 기술 : 자바스크립트 / node-forge / X.509
- 사전) 👉 X.509 간단 설명 :
>> X.509 는 공개키 기반 구조 (PKI, Public Key Infrastructure) 에서 사용되는 디지털 인증서의 표준 규격입니다.
>> X.509 는 인터넷에서 사용하는 SSL/TLS 인증서, AWS IoT 인증서, 전자서명 인증서 등이 어떤 형식으로 구성되어야 하는지 정의한 국제 표준입니다.
>> X.509 인증서는 다음 정보를 담고 있습니다.
- "이 공개키는 누구의 것인가?"
- "누가 이 공개키를 보증하는가?"
- "언제까지 유효한가?"
>> X.509 인증서 구조 : Base64로 인코딩된 ASN.1 데이터가 들어있습니다.
-----BEGIN CERTIFICATE-----
MIIDYzCCAkugAwIBAgI...
...
...
-----END CERTIFICATE-----
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
[소스 코드]
-----------------------------------------------------------------------------------------
<!DOCTYPE HTML>
<html lang="ko" translate="no">
<head>
<title>javaScriptTest</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 반응형 구조 만들기 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<!-- Chrome / Edge (Chromium)에서 자동 번역 기능을 완전히 비활성화 -->
<meta name="google" content="notranslate">
<!-- 내부 CSS 스타일 지정 -->
<style>
html, body {
width: 100%;
height: 100%;
margin : 0 auto;
padding : 0;
border : none;
background-color: #666;
}
</style>
<!-- [CDN 주소 설정] -->
<script src="https://code.jquery.com/jquery-latest.min.js"></script>
<!-- node-forge 라이브러리 -->
<script src="https://cdn.jsdelivr.net/npm/node-forge@1.3.1/dist/forge.min.js"></script>
<!-- [자바스크립트 코드 지정] -->
<script>
// -----------------------------------------------------------------
// 🟦 [Window.onload : 웹 브라우저 로드 완료]
// -----------------------------------------------------------------
window.onload = async function() {
console.log("[window onload] : [html 최초 로드 및 이벤트 상시 대기 실시] : [start]");
};
// -----------------------------------------------------------------
// 🟦 [simpleValidateCertificate: 간편 인증서 확인 함수]
// -----------------------------------------------------------------
function simpleValidateCertificate(cert){
var returnData = false;
try {
if (cert !== null && cert !== undefined && cert !== ''){
if (cert.includes("BEGIN CERTIFICATE") && cert.includes("END CERTIFICATE")){
console.log("[simpleValidateCertificate] : [Success] : ✅ contents includes check");
returnData = true;
}
else {
console.error("[simpleValidateCertificate] : [Error] : ❌ contents includes error");
}
}
else {
console.error("[simpleValidateCertificate] : [Error] : ❌ cert is null");
}
}
catch(exception){
console.error("[simpleValidateCertificate] : [Exception] : ❌ 예외 상황 발생 : ", exception);
}
return returnData;
};
// -----------------------------------------------------------------
// 🟦 [getSha256Fingerprint : 인증서 식별 정보 확인]
// -----------------------------------------------------------------
function getSha256Fingerprint(cert){
var returnData = '';
try {
if (cert !== null && cert !== undefined && cert !== ''){
const md = forge.md.sha256.create();
md.update(
forge.asn1.toDer(
forge.pki.certificateToAsn1(cert)
).getBytes()
);
returnData = md.digest().toHex()
.match(/.{1,2}/g)
.join(":")
.toUpperCase();
console.log("[getSha256Fingerprint] : [Success] : ✅ 인증서 식별 정보 확인" + "\n\n" + returnData);
}
else {
console.error("[getSha256Fingerprint] : [Error] : ❌ cert is null");
}
}
catch(exception){
console.error("[getSha256Fingerprint] : [Exception] : ❌ 예외 상황 발생 : ", exception);
}
return returnData;
};
// -----------------------------------------------------------------
// 🟦 [checkCert : 인증서 정보 확인 함수]
// -----------------------------------------------------------------
function checkCert(){
console.log("[checkCert] : [인증서 정보 확인] : [start]");
try {
// -----------------------------------------
// [선택 된 파일이 있는지 확인]
// -----------------------------------------
const fileInput = document.getElementById("certFile");
const file = fileInput.files[0];
if (!file) {
alert("파일을 선택하세요.");
return;
}
console.log("📄 checkCert : 선택된 파일 : " + file.name);
// -----------------------------------------
// [선택 된 파일 내용 읽기]
// -----------------------------------------
const reader = new FileReader();
reader.onload = function(event) {
let certPem = event.target.result;
// ✅ 중요: PEM 정리
certPem = certPem
.replace(/^\uFEFF/, "") // BOM 제거
.replace(/\r\n/g, "\n") // 줄바꿈 통일
.trim();
console.log("✅ checkCert : 인증서 파일 읽기 완료 : " + "\n\n" + certPem);
if (simpleValidateCertificate(certPem) == false){
/*
-----BEGIN CERTIFICATE-----
MI....NA
-----END CERTIFICATE-----
*/
return;
}
// -----------------------------------------
// X.509 인증서 파싱
// -----------------------------------------
const cert = forge.pki.certificateFromPem(certPem);
const now = new Date();
const notBefore = cert.validity.notBefore;
const notAfter = cert.validity.notAfter;
console.log("checkCert : 인증서 파일 유효 기간 확인 : ", notBefore + " / " + notAfter);
let status = "유효";
if (now < notBefore) {
console.warn('checkCert : 인증서 : 아직 유효기간 시작 전');
}
else if (now > notAfter) {
console.error('checkCert : 인증서 : 만료');
}
else {
console.log('checkCert : 인증서 : 유효 : ', JSON.stringify(cert));
const certPrint = getSha256Fingerprint(cert);
// -----------------------------------------
// 출력 되는 로그 예시
// -----------------------------------------
/*
[getSha256Fingerprint] : [Success] : ✅ 인증서 식별 정보 확인
85:A4:..:2B:78
*/
// -----------------------------------------
}
};
// ✅ 반드시 TEXT 로 읽기
reader.readAsText(file);
}
catch (exception) {
console.error("[checkCert] : [Exception] : ❌ 예외 상황 발생 : ", exception);
}
};
</script>
</head>
<body>
<h2>📄 인증서 확인</h2>
<!-- ✅ 파일 선택 -->
<input type="file" id="certFile" accept=".pem,.crt,.txt" />
<br><br>
<!-- ✅ 버튼 -->
<button onclick="checkCert()">인증서 확인</button>
</body>
</html>
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
[참고 사이트]
-----------------------------------------------------------------------------------------
▶️ [자바스크립트 node-forge 라이브러리 사용해 X.509 인증서 만료 기간 유효성 검증 수행]
https://kkh0977.tistory.com/8892
https://blog.naver.com/kkh0977/224307272979
▶️ [자바스크립트 AWS Iot registerCertificateWithoutCA 사용해 클레임 인증서 등록 요청 수행 - 공통 클레임 인증서 사용]
https://kkh0977.tistory.com/8886
https://blog.naver.com/kkh0977/224306059609
▶️ [Aws Iot Core] Aws 프로비저닝 수행에 필요한 클레임 인증서 (claim certificate) 설명 정리
https://kkh0977.tistory.com/7799
https://blog.naver.com/kkh0977/223784109192?trackingCode=blog_bloghome_searchlist
▶️ [Aws Iot Core] Aws Iot Core 프로비저닝에 사용 되는 클레임 인증서 종류 설명 및 생성 방법 정리
https://kkh0977.tistory.com/8100
https://blog.naver.com/kkh0977/223918338710?trackingCode=blog_bloghome_searchlist
▶️ [Aws] IoT 디바이스 기기 프로비저닝 수행에 필요한 개발, 운영 인증서 동적 교체 및 다운로드 로직 정리 - 클레임 인증서 다운로드
https://kkh0977.tistory.com/8837
https://blog.naver.com/kkh0977/224290535389?trackingCode=blog_bloghome_searchlist
▶️ [Aws Iot Core] Fleet provisioning 플릿 프로비저닝 수행 방법 정리 - 클레임 인증서 , 신뢰할 수 있는 사용자
https://kkh0977.tistory.com/7761
https://blog.naver.com/kkh0977/223779257161?trackingCode=blog_bloghome_searchlist
-----------------------------------------------------------------------------------------
728x90
반응형
'JavaScript' 카테고리의 다른 글
Comments
