Javascript만으로 전자서명하기

serialx의 이미지

아직까지는 IE/Firefox만 지원하는 기능들입니다만 (표준은 아닙니다) 여기 계신 다른 분들과도 공유하면 좋을것 같아 올립니다.

http://bozhobg.wordpress.com/2009/04/16/how-to-create-a-digital-signing-solution-with-only-javascript/

보시다시피 크롬이나 오페라에서도 crypto.signText 에 대한 수요가 있고 외국 사람들이 개발사에게 압박(?)을 하고 있습니다. 한국은 왜 이런걸 못할까요:

http://www.google.com/support/forum/p/Chrome/thread?tid=3506388787b6fb7d&hl=en

http://my.opera.com/community/forums/topic.dml?id=126569

그리고 아무도 왜 이런걸 찾아서 KLDP나 보안 커뮤니티에 공유를 하지 않을까요..

serialx의 이미지

http://serialx.net/~serialx/sign_test/

여기에 테스트 올렸습니다. IE는 ActiveX급으로 불편하고 (설치하지는 않지만 - -;)

Firefox 에서도 잘 동작하네요.

(개인 인증서가 브라우저에 올라가셔야 합니다)

bushi의 이미지

전자서명요 ? 전자서명 말입니까 ?
MS 가 MS-DOS 로 밥벌어 먹던 그 시절에... 메일 보낼 때 조차도 개인인증서로 서명해서 보낸 사람들입니다.
ssh 가 등장하기 전엔 서버 로그인에도 OTP 를 적용했던 사람들이란 말입니다.

'개인인증서를 하드디스크 혹은 USB 메모리 등에 저장하는 것'을 부정하는 것이고,
그것의 보완책인 '키보드를 이용한 비밀번호 입력'을 부정하는 것이고,
이것의 보완책인 '키보드 보안'을 부정합니다.

오픈 웹에선 같은 것을 순서만 반대로 말합니다.
특정 OS 혹은 특정 브라우저에서나 해당되는 '키보드 보안'이라는 요소를 없애려면,
'키보드를 이용한 비밀번호 입력'을 없애야하고,
이걸 없애려면 '개인 인증서를 하드 디스크 혹은 USB 메모리에 저장하는 것' 을 없애야만 합니다.

짧게 쓰죠.

[bushi@rose net]$ yum search smartcard
Loaded plugins: presto, refresh-packagekit
adobe-linux-i386                                         |  951 B     00:00     
rpmfusion-free-updates                                   | 3.3 kB     00:00     
rpmfusion-nonfree-updates                                | 3.3 kB     00:00     
updates/metalink                                         | 6.2 kB     00:00     
============================== Matched: smartcard ==============================
gdm-plugin-smartcard.i686 : GDM smartcard plugin
ctapi-cyberjack.i686 : CT-API 1.1 driver for REINER SCT cyberjack USB chipcard
                     : reader
esc.i686 : Enterprise Security Client Smart Card Client
ifd-egate.i686 : Axalto Egate SmartCard device driver for PCSC-lite
libgpg-error.i686 : Library for error values used by GnuPG components
libgpg-error-devel.i686 : libgpg-error 패키지에 사용되는 개발용 파일
monosim.i686 : Manage your SIM Card contacts
pam_pkcs11.i686 : PKCS #11/NSS PAM login module
pcsc-lite.i686 : PC/SC Lite smart card framework and applications
[bushi@rose net]$

사이트 링크해드릴까요 ?
http://kldp.org/node/82477
http://kldp.org/node/111952
http://kldp.org/node/79564
http://kldp.org/node/80345
http://kldp.org/node/111573
http://kldp.org/node/110712
http://kldp.org/node/90629
http://en.wikipedia.org/wiki/PC/SC
http://freshmeat.net/projects/opensc

'보안'이 뭔지 모르는 데도 마치 전문가인양 보안 운운하는 사람과 대화를 하기 위해선 이런 것들이 적절치 않습니다.
앞서 열거한 모든 부정적인 요소들을 배제하면서도 개인에게 책임을 전가할 수 있는 다른 대안을 찾는 것 뿐이지,
전자서명이 열등하기 때문에 다른 방법을 찾는 것은 아닙니다.

손가락을 쳐다보지 마시고, 그 손가락이 무엇을 가리키고 있는지 쳐다보세요.

OTL

foo의 이미지

전자인증을 부정한 적은 없는것같은데요?

공인인증서도 일반 사설 인증서도 그 정도 수준의 가치를 가집니다. 모든 논의에서 그것마져 부정하고 있지는 않습니다.

하지만 *공인*인증서를 부정해야 할 이유는 충분히 있지요. 그것의 가치를 부정하는게 아니라 왜 하필 *공인* 인증서라는 거죠. ActiveX없이는 제대로 쓸 수 없는 상황이 되어버린 이 상황이
오픈웹 혹은 오픈소스 진영에 있어서 사용자 및 서비스 제공자의 자유권을 중대하게 침해했다고 보는 것이지요.

관점의 시작을 이렇게 이해하셔야 하는데, 공인*인증서*를 부정하는 것으로 잘 못 이해하고 계셔서 계속 논의가 헤메고 있는 중인 것으로 보이네요.

bushi의 이미지

serialx 님은 전자서명자체가 kldp에서 부정되는 걸로 오해하고 계십니다.
그래서 저토록 전자서명의 우월성과 당위성과 적법성을 증명하기 위해 뛰시는 거고요.
대한민국에서 전자서명을 위해 구현된 *체계*가 이미 전자서명 그 자체를 위협하고 있다는 것을 깨닫길 바래서 쓴 글입니다.

OTL

tj의 이미지

> 보시다시피 크롬이나 오페라에서도 crypto.signText 에 대한 수요가 있고 외국 사람들이 개발사에게 압박(?)을 하고 있습니다.

우선은 저런 정도면 수요가 거의 없다라고 말하는 게 맞겠죠. 온갖 잡 feature request도 저것보단 호응이 많습니다. 사이닝 기능이 매력적인 면이 있지만 널리 쓰이지 않는데는 그만한 이유가 있는거구요.

> 한국은 왜 이런걸 못할까요

업스트림 개발에 개발자로도 유저로도 잘 참여를 못하는 건 언어/문화 장벽 문제도 큰 것 같고, 그럴 시간도 여유도 없어서 그런 면도 있는 것 같아요.

webkit에 사이닝 구현해서 보내보세요. 구현 방법에 관계없이 NACK 먹는다에 백원겁니다.

channy의 이미지

PKI에서 부인 방지의 요체가 되는 SSL 클라이언트 인증서 및 전자서명 기능은 웹이 시작될때 부터 구현 되어있었습니다.
http://docs.sun.com/source/816-6152-10/sgntxt.htm

1998년 Netscape에 처음 탑재되었고 IE에서는 CAPICOM이라는 activex 콘트롤로 구현 가능합니다.
사실상 우리나라 전자 서명법과 그 규격은 사실 이 기술의 copycat이라고 보시면 됩니다. 과거 베리사인에서도 기업 솔루션에 activex/java plugin기반 전자서명 도구를 제공하기도 했습니다. 지금은 HSM이랑 OTP 사업만 하는 걸로 봐서 플러그인 기반 제품들은 걷어 낸 걸로 보입니다
http://www.verisign.com/authentication/enterprise-authentication/enterprise-otp/

웹 브라우저에서 전자서명일 수행하는 crypto.signText는 초창기 Mozilla에서 보안 공격이 많아서 deprecated 됐다가 얼마 전 다시 기능이 제공되는데 브라우저에 탑재된 SSL 인증기관에서 발급한 인증서에서만 가능하도록 제한이 좀 강화되었구요. (동일하게 Opera에도 탑재되어 있지요.)
http://code.google.com/p/doctype/wiki/CryptoSignTextMethod

근데 13년이나 된 기술이 왜 웹 표준화도 안되고 있느냐? 바로 tj님 말씀대로 외국에서는 수요가 거의 없기 때문입니다. 상업 등기, 전자 문서 서명 및 입찰, 기업간 거래 등의 분야에서는 이미 다양한 제품과 SW가 상용화 되어 있으나 웹 기반으로 구현하는 곳은 거의 없습니다.

WHATWG과 W3C의 HTML5 w/g에서 제가 여러번 공감대 형성을 위해 노력 했지만 니즈가 없다는 것을 확인했습니다. 현재 이 이슈는 webapps w/g으로 넘어와 있으나 1년이 넘게 아무런 액션이 없는 상태이죠. 아래 메일 쓰레드를 읽어보시면 잘 파악하실 수 있습니다.
http://lists.w3.org/Archives/Public/public-webapps/2009JanMar/0898.html

그냥 w/g에서 메일링리스트에 이야기만 해봤자 아무런 도움이 안된다는 판단하에 그 이후에 현재 Mozilla와 Opera 사람들을 중심으로 공감대 형성 및 기본 스펙 작업을 하고 있긴 합니다만 시간이 좀 소요될 것 같네요.

말씀 하신 정보들은 pki를 좀 아는 사람들은 거의 다 아는 기본 지식입니다.

단지 웹 브라우저에서 native signing을 처리하려면 웹 브라우저에 국내 공인 인증기관 루트 인증서가 정식 탑재되고, 공인 인증서가 pkcs#12로 잘 import/export 되어야 하며 crypto.signText 같은 기능이 잘 동작해야 합니다. 각 이슈 마다 나름의 문제들이 여러개 존재하고 있구요. 특히, 국내 공인 인증서들이 국제 규격을 벗어나는 다양한 extension 들이 있어서 문제이기도 합니다. 또한, 공인 인증서 암호의 경우도 웹 브라우저에 따라서 지원하지 않거나 master password로 보호 하고 있는 점에서 차이가 납니다.

또 다른 문제는 전자서명 웹 표준화에 대해 KISA나 국내 (공인 인증) 보안 업계의 노력은 전무하다시피 합니다. 구현 노력은 어느 정도 하고 있으나 OpenSSL에 SEED 탑재를 한 것도 perky님이었고, 이를 기반으로 KISA에서 Firefox에 SEED알고리듬을 탑재했지만 KISA root ca 인증서 탑재에 수 년이 걸려도 못하고 있는 상태입니다.
http://openlook.org/blog/2007/04/26/cb-1168/
http://kldp.org/node/83195
https://bugzilla.mozilla.org/show_bug.cgi?id=545577
https://bugzilla.mozilla.org/show_bug.cgi?id=335197

어쨌든 전자서명 웹 표준화를 비롯해서 제가 생각하는 단계적 해결 방안은 2007년에 썼던 제 글을 참고하세요.
http://blog.creation.net/136

Channy Yun

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

Channy Yun

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

buelgsk8er의 이미지

논쟁을 죽 지켜보고 있는데, 공인이건 사설이건 인증서가 필요한지 잘 모르겠어요

비밀키 유출 불가능한 USB보안토큰 내부에서 비밀키+공개키 생성하게 하고,

사용자는 보안토큰을 은행에 가서 공개키 등록하고,

웹에서 거래할 때는 국가표준인 API를 통해 거래 내역을 보안토큰에 보내서 서명/반환받아 보안채널로 전송하고,

그러면 되는 것 아닌가요?

보안토큰 비용이야 대량으로 만들면 아주 싸게 만들 수 있을 것 같은데 말이지요.

제가 뭔가 놓치고 있는 건가요?

n2mart의 이미지

정확한 정답입니다.

비밀키 유출 불가능한 USB보안토큰 내부에서 비밀키+공개키 생성하게 하고,
--> 비밀키를 보호합니다. 암복호화 처리 절차를 주 컴퓨터(PC, 스마트폰 등)처리 하지 않아서 메모리 해킹에 대해 안전합니다.

사용자는 보안토큰을 은행에 가서 공개키 등록하고,
--> 공인인증서 발급됩니다.

웹에서 거래할 때는 국가표준인 API를 통해 거래 내역을 보안토큰에 보내서 서명/반환받아 보안채널로 전송하고,
--> 인증, 부인방지 됩니다. Single Channel Security 보장됩니다.

그러면 되는 것 아닌가요?
--> 정답입니다.

보안토큰 비용이야 대량으로 만들면 아주 싸게 만들 수 있을 것 같은데 말이지요.
--> EU에서는 이미 각 국가별로 수천만개씩 만들어 보급하면서 이미 몇천원대로 내려가 있습니다.

제가 뭔가 놓치고 있는 건가요?
--> 놓치고 있는 것 없습니다. 다만, 스마트폰이나 디바이스에서 사용하기 힘들다는 것이지만, 그것도 USIM이나 인터페이스 문제로 해결하면 됩니다.