모질라 Firefox와 공인인증서

wkpark의 이미지

Fedora 10을 설치하고 mod_ssl 설정과 공인인증서를 테스트해보았습니다.

언젠가부터 공인인증서 파일을 export한 후에 그 파일을 모질라 firefox에서 인증서로 등록할 수 있었습니다.

작년인가... 제가 KLDP에 글을 쓴 적이 있는데,
페도라 8, 페도라 9에서 mod_ssl과 공인인증서는 전혀 작동하지 않거나 오류가 났었습니다.
그때 openssl을 패치하면 공인인증서를 firefox + mod_ssl에서 쓸 수 있다는 내용을 KLDP에 썼었는데... (그 원글이 어디있는지 찾지를 못하겠군요.)

그런데 몇일 전 페도라 10으로 업그레이드를 한 후에 다시 테스트해보니 모질라 Firefox+mod_ssl 조합이 공인인증서를 읽어들이는군요.
(아무런 패치 없이 통과. firefox 버전 3.0.8 스샷 첨부합니다.)

접속하면 공인인증서를 선택하라는 창이 뜹니다.
비밀번호는 공인인증서 파일을 읽어서 등록시킬때 물어봅니다. 따라서 이 선택창이 떳을 경우, 비번을 물어보지 않습니다.^^;;
그냥 이미 등록된 인증서를 선택하면 땡입니다.

공인인증서를 선택하면

스샷은 https://192.168.xx.xx/cert.php 같은 식으로 접속하고 cert.php는 단순히 SSL_CLIENT 환경변수를 프린트한 것일 뿐입니다.

이걸로 뭘 할 수 있을지는 저는 잘 모르겠습니다ㅋ
단지 SEED모듈도 openssl에 들어가고, 공인인증서를 firefox에서 읽을 수 있기에
테스트해봤던 것입니다.

== mod_ssl + 공인인증서 사용 방법 ==
1) mod_ssl 설정 (/var/www/html/certs 아래 디렉토리에 yessign.crt를 적절히 등록시켜야 한다.)
2) 공인인증서를 firefox로 읽어들인다. (공인인증서를 *.pfx 파일로(혹은 다른 파일로) 익스포트한 후에 이것을 읽음)

File attachments: 
첨부파일 크기
Image icon ss.png51.67 KB
Image icon ss1.png42.23 KB
Image icon ss2.png17.01 KB

댓글

queryman의 이미지

좋은 정보 감사합니다 ^^
조만간 firefox 같은 비주류? 브라우저에서도 뱅킹을 할수잇었음 좋겟네요 ㅎ

-------------------------------------------------------------------------------------------
생각은 지나가던 개새끼도 하지.. 실천하는건?? 나도 할수있지...
http://www.mrdics.com


-------------------------------------------------------------------------------------------
이놈의 IT 생활... 실증나고 짜증나고...
근데 왜 맨날 it관련 소식만 보고 ;;; 님휘

죠커의 이미지

인증서가 등록이 되는군요. :) 결제내역에 대한 전자서명이 이루워져야 하기 때문에 인증서만으로는 안될 것 같습니다.

- 죠커's blog / HanIRC:#CN

channy의 이미지

네.. yessign 공인 인증서 불러오기 오류 문제는 extension 처리 때문에 안됐던걸로 알고 있습니다.
이 문제는 아마 Mozilla쪽에서 풀었던 것 같네요. yesssign을 제외한 다른 회사 인증서는 과거에도 문제가 없었습니다.
현재 NSS에 SEED 탑재는 완료가 되었구요. KISA Root CA 인증서도 2년 동안 holding 상태인데 곧 될 것 같네요.

문제는 이게 아니라 Digital Signature 입니다. 이 기능이 현재 브라우저에 탑재되어 있지 않기 때문에
현재 방식을 그대로 Firefox에 적용하는 건 쉽지 않을 것 같네요.

표준화 이슈에 대해서도 나름대로 3년간 노력을 해봤는데
WHATWG과 W3C의 html w/g 과 webapps w/g에서도 이 문제에 대해 별로 관심을 가지고 있지 않습니다.

http://lists.w3.org/Archives/Public/public-webapps/2009JanMar/0898.html

Channy Yun

Mozilla Korean Project
http://www.mozilla.or.kr

Channy Yun

Mozilla Korean Project
http://www.mozilla.or.kr

exman의 이미지

NSS 에서 SEED가 탑재 되었다고 하셨는데 어느 부분에서 쓰이고 있나요?

국내 법에서 SEED를 강제하고 있는 부분이 PKCS#8 개인키 암호화에 쓰고 있는것은 인터넷 검색으로 찾아봤는데요.
위에 wkpark 님도 PKCS#12 로 변환후에 등록하셨듯이 Firefox 에서는 PKCS#8 개인키를 가져오는 화면 인터페이스가 없습니다.

그렇다면 딱히 쓰일곳이 TLS 에서의 CipherSuite 밖에는 안보이는데요.
혹시 TLS(SSL) 에서도 Sipher Suite 로 SEED를 사용해야 하는 조항도 있나요? NSS에 SEED가 들어온것이 Firefox의 국내 환경 적용에 어떤 효과가 있는지 궁금합니다.

channy의 이미지

그렇습니다. CipherSuite 밖에 쓰일 때가 없죠.
https://bugzilla.mozilla.org/show_bug.cgi?id=453234

SSL에서 암호 알고리듬을 SEED를 써라는 조항은 없습니다. 지금도 공인 인증 플러그인은 FORM Signing에만 SEED를 사용합니다. (이건 강제였던 것 같은데.)

이 작업은 만약 전자서명이 브라우저에 표준화될 것에 대비해서 시작한 것입니다. 혹시라도 사용자의 특정 액션을 서명으로 간주하고 이 데이터가 SSL을 통해 전해질때 서명으로 인정하는 기술 규격이 나오면 그 때도 유용할지도 모르겠습니다.

Channy Yun

Mozilla Korean Project
http://www.mozilla.or.kr

Channy Yun

Mozilla Korean Project
http://www.mozilla.or.kr

youknowit의 이미지

client 인증서가 사용되는 용도는 두가지 입니다. 하나는 "인증서 로그인"(authentication), 다른 하나는 "거래 내역에 대한 전자서명"(non-repudiation).

물론, 두가지 모두 서명기능은 필요합니다.

그러나, 인증서 로그인에 필요한 수준의 서명기능은 주요 웹브라우저에 이미 built-in 되어 있습니다(SSL 프로토콜의 당연한 일부입니다). 이때 이루어지는 서명은 ssl 서버가 던져주는 random number 를 클라이언트가 자신의 개인인증서의 private key로 전자서명하여, 서버에게 전송(개인인증서와 함께) 하는 것입니다. 그러면 서버는 이것을 받아서, 서명검증을 해보고, 검증에 성공하면 SSL client authenticated session 이 개시되는 것입니다.

그러나, 거래 내역에 대한 전자서명 기능은 웹브라우저에 없습니다. 인터넷으로 이루어지는 "거래의 내역"을 서명대상 문서로 하여 그 문서를 전자서명하여 서버에게 전송하는 기능을 말합니다. (아까 경우는 그저 random number 만 서명하면 되지만, 거래 내역은 무한히 다양할 수 있고, 그것을 어떻게 포맷하고, 구문구조를 어떻게 할 것인지는 매우 큰 변수들이 있습니다, 그래서 웹브라우저에 built-in 되기에는 비현실적이지요)

"공인인증서를 사용하라"고 금감원이 난리를 치니, 이렇게 공인인증서로 "로그인"을 하면, 그것도 공인인증서를 사용하는 것이지요.

사실 저는 이렇게 공인인증서 로그인을 하는 것을 적극 권장하는 입장입니다. 그렇게 이루어지는 클라이언트 인증 세션은 여러 공격에 대한 매우 훌륭한 방어책이 될 뿐 아니라, 별도의 플러그인 없이 웹브라우저 만으로도 가능하기 때문입니다.

http://openweb.or.kr

exman의 이미지

저도 한번 따라 해보고자 Firefox 에 개인인증서를 등록하기 위해서 개인키(SignPri.key)를 포함한 pkcs#12 포멧 (.p12 or .pfx) 로 변환하여 등록하였는데요. 이 변환하는 과정을 openssl로는 할수가 없어서 Initech 에서 제공한 툴을 이용해서 했습니다. 그런데 제 윈도우즈용 파이어폭스에서 등록한 개인인증서를 '인증서 보기'로 열어 보면 '알 수 없는 이유로 인증서를 확인할 수 없습니다'로 나오고 있습니다. 크롬브라우져에서는 '정보 부족으로 유효하지 않다' 로 나오고 있습니다.

그래서 원인을 알아 보고자 openssl 을 이용하여 제 인증서를 Verify 해보았는데요.

제가 Yessign에서 발급받은 인증서(Certificate) SignCert.der 를 PEM 포멧으로 변경후 openssl 로 verify 해보면

$ openssl verify -CApath certs_dir SignCert.pem
unable to get local issuer certificate

라고 나옵니다.

참고로 CApath 디렉토리에는 http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 에서 다운받을 수 있는 Mozilla 의 최신 CA 인증서 목록을 사용해서 openssl 이 읽을수 있는 subject hash 를 파일명으로 하도록 저장하여 테스트 하였습니다.

즉 저 에러는 제 인증서의 발급자인 yessign 이 (모질라의) CA 인증서에 포함되어 있지 않다는 이야기인데요. 별도로 yessign 의 인증서를 Firefox의 '인증서 관리자'에 '인증 기관'에 추가하면 아마도 Verify 되었다고 나올것입니다.

wkpark님은 Firefox 에서 인증서 보기 하셨을때 유효하다고 나오시나요? 만약 나온다면 yessign 의 인증서를 별도로 Firefox 에 추가하셨나요?

그리고 cert.php 가 출력하는 환경변수 중에 SSL_CLIENT_VERIFY=SUCCESS 의 의미도 궁금합니다. (사실 제가 SSL과 Apache를 잘 몰라서... 따라 해보지는 못했습니다.)
이 SUCCESS의 뜻이 SSL 초기 과정에서 Client(Firefox) 가 보낸 메시지 서명을 Verify 했다는 것인지 Client 인증서를 Verify 했다는 것인지 궁금합니다. 만약 후자라면 Apache 서버의 설정 (아마도 mod_ssl 쪽?)에 CApath 가 기술 되어 있고, 그곳에 yessign 의 인증서가 포함되어 있어서 Verify 에 성공했다는 이야기 일텐데요. 혹시 별도로 yessign 인증서를 서버에 추가하셨는지요?

wkpark의 이미지

> wkpark님은 Firefox 에서 인증서 보기 하셨을때 유효하다고 나오시나요? 만약 나온다면 yessign 의 인증서를 별도로 Firefox 에 추가하셨나요?

아니요 :) 유효하지 않다고 나옵니다ㅋ. 브라우져에서 일부 제대로 지원하지 않거나 뭔가 잘못되었구나라고만 생각하고 있었습니다. 인증서의 문제가 있는 경우는 아예 등록이 안되기때문에 큰 문제는 아니라고 봤었지요.

> 즉 저 에러는 제 인증서의 발급자인 yessign 이 (모질라의) CA 인증서에 포함되어 있지 않다는 이야기인데요. 별도로 yessign 의 인증서를
> Firefox의 '인증서 관리자'에 '인증 기관'에 추가하면 아마도 Verify 되었다고 나올것입니다.

아.. 그러고보니 서버단에는 yessign 인증기관 관련 파일을 등록했는데, 브라우져단에는 안했었네요ㅎ

> 혹시 별도로 yessign 인증서를 서버에 추가하셨는지요?
예. 그렇게 했다고 위의 설명에 살짝 써놓았습니다. 그거 추가 안하면 오류 메시지와 함께 인증을 실패하더군요.

cert.php의 내용은 다음과 같습니다.

<TITLE>Apache-SSL Certificate Export</TITLE>
<BODY>
<CENTER><IMG SRC="mod_ssl.png"><H1>Apache mod-SSL Certificate Export</H1></CENTER>
<HR><BR>
Your browser presented the following certificate:
<PRE><CODE><STRONG><BLOCKQUOTE>
<?php
#echo -n $SSL_CLIENT_CERT | /bin/dd cbs=64 conv=unblock 2>/dev/null
echo $_SERVER['SSL_CLIENT_CERT'];
#echo "-----END CERTIFICATE-----") | /usr/local/ssl/bin/openssl x509 -text
echo "</PRE></CODE></STRONG></BLOCKQUOTE>";
echo "This server set the following environment variables:";
echo "<PRE><CODE><STRONG><BLOCKQUOTE>";
echo "\n";
echo "<I>Client:</I>\n";
foreach ($_SERVER as $k=>$v) {
 if (preg_match('/^SSL_CLIENT/',$k))
 echo $k.'='.$v."\n";
}
echo "<I>Server:</I>\n";
foreach ($_SERVER as $k=>$v) {
 if (preg_match('/^SSL_SERVER/',$k))
 echo $k.'='.$v."\n";
}
echo $_SERVER['SSL_SERVER']."\n";
echo "<I>Protocol:</I>"."\n";
echo "HTTPS=".$_SERVER['HTTPS']."\n";
echo "SSL_CIPHER=".$_SERVER['SSL_CIPHER']."\n";
echo "SSL_PROTOCOL=".$_SERVER['SSL_PROTOCOL']."\n";
echo "</PRE></CODE></STRONG></BLOCKQUOTE>";
echo "<HR><BR>";
echo "</BODY>";

온갖 참된 삶은 만남이다 --Martin Buber

exman의 이미지

앗 서버쪽은 추가 하신 것을 제가 못보았었군요 ^^;

이렇게 테스트 하는 경우 말고 실제 서비스 하는 사이트에서 HTTP over SSL를 사용하면서 Client 인증서를 요구하는 곳은 한번도 못보긴 했습니다만, 어찌되었건 우리가 많이 쓰는 공인인증서의 활용이 가능은 하겠군요.
혹시 실제로 서비스를 하는 곳을 알고 계시나요? 한번 제 개인인증서로 접속해보고 싶네요 ㅎㅎ

그런데 예전에 'openssl을 패치하면 공인인증서를 firefox + mod_ssl에서 쓸 수 있다' 라는 말이 잘 이해가 안되는데요.
환경변수 SSL_CLIENT_CERT 에 있는 PEM 형식의 인증서가 Yessign 에서 개인에게 발급한 SignCert.der 을 PKCS#12 으로 FIrefox 에 등록했었던 일것인데요. 서버(mod_ssl)에서 이루어지는 이 Client 인증서의 Verify 와 관련해서는 openssl 패치(아마도 SEED 패치?)와 상관이 없을텐데, 예전에는 어떤 문제가 있었던 것인가요?

wkpark의 이미지

> 리고 예전에 'openssl을 패치하면 공인인증서를 firefox + mod_ssl에서 쓸 수 있다' 라는 말이 잘 이해가 안되는데요.

제가 문제의 부분을 발견만 하고 해결 못했던 것인지 기억이 가물거리는데요.

패치를 찾았는데 너무 단순해서 ;;;

서버단에 등록한 인증서의 X509v3 extensions 의 일부 critical flag가 붙은 경우 openssl에서 제대로 파싱하지 못하는 문제였다고 기억합니다.
(디버깅해서 찾은것이므로 기술적은 부분은 모릅니다 ^^)

패치도 매우 단순해서, extension의 NID를 몇개 더한 정도였습니다. (아래 참조)
(그게 서버단 인증서였는지, 개인의 공인인증서때문이였는지도 기억이 가물거리네요 ㅠ. 로그를 켜고 openssl에 같이 들어있던 내장 서버 프로그램으로 테스트했던 기억이 납니다.)

벌써 최신 openssl은 0.9.8k네요.
http://cvs.openssl.org/rlog?f=openssl/crypto/x509v3/v3_purp.c 를 참고하세요.

diff -ru openssl-0.9.8b/crypto/x509v3/v3_purp.c openssl-0.9.8b.new/crypto/x509v3/v3_purp.c
--- openssl-0.9.8b/crypto/x509v3/v3_purp.c      2005-04-10 01:07:10.000000000 +0900
+++ openssl-0.9.8b/crypto/x509v3/v3_purp.c      2008-06-02 17:05:48.000000000 +0900
@@ -285,7 +285,9 @@
                NID_key_usage,          /* 83 */
                NID_subject_alt_name,   /* 85 */
                NID_basic_constraints,  /* 87 */
+               NID_certificate_policies, /* 89 */
                NID_ext_key_usage,      /* 126 */
+               NID_policy_constraints, /* 401 */
                NID_proxyCertInfo       /* 661 */
        };

온갖 참된 삶은 만남이다 --Martin Buber

exman의 이미지

아앗 답변 감사합니다.
그 패치가 Seed 관련한 패치는 아니었군요.

보여주신 패치를 바탕으로 제 맥북에 설치된 0.9.7l과 0.9.8i 로 X509v3 Policy Constraints 표시여부를 보니까 다음과 같은 차이가 있네요.

0.9.7l 일때 openssl x509 -in yessign.der -inform DER -text -noout

X509v3 extensions: 
           ... 생략 ...
            X509v3 Policy Constraints: 
                0....
           ... 생략 ...

0.9.8i 일때 openssl x509 -in yessign.der -inform DER -text -noout

X509v3 extensions:
           ... 생략 ...
            X509v3 Policy Constraints: 
                Require Explicit Policy:0
           ... 생략 ...

openssl 명령에서는 무시되어 에러가 나지는 않습니다만 mod_ssl 같은데서 직접 x509 API 를 썼을때는 뭔가 에러가 발생 했을것 같네요.
친절한 답변 감사합니다. :-)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.