질문/답변 페이지 많이 이용해 주세요.

Archive for 2월 2011

PKCS12 인증서를 Java keystore에 넣기.

PKCS12 인증서를 Java keystore에 넣기.

JDK1.5까지는 제공되지 않았던 기능으로 보이는데, JDK1.6에서는 keytool 명령으로 pkcs12인증서(*.p12)를 java keystore에 넣는 것이 가능하도록 바뀌었습니다.

keytool \
-importkeystore \
-srckeystore cert.p12 \
-destkeystore keystore.jks \
-srcstoretype pkcs12 \
-deststoretype jks \
-srcalias mycert \
-destalias mycert

대학 포털.

현재 대학교에 필요하다고 생각하는 서비스로 포털이 있습니다.

그리고 그 포털의 모양은 검색 + 소셜입니다.

기존의 포털과 같이 여러가지 서비스들을 요약해서 보여주는 기능 보다는 강력한 검색엔진을 두고, 소셜(트위터 모델 or 페이스북 모델 or 혼합 )기능을 가지면 될 것으로 보입니다.

구글과 같은 모양이지요.( 단, 소셜기능을 위한 화면 구성이 있을 것이고. )

포털에서 다른 서비스의 경우 구글과 같이 상단에 목록형태로 있으면 될 것으로 보입니다.
( 페이스북 혹은 안드로이드와 같이 알림 영역을 가지면 좀더 편리하겠지요. )

브라우저에서 제공하는 기능(javascript)으로 전자서명하기.

브라우저에서 제공하는 기능(javascript)으로 전자서명하기.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ko-KR">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>전자서명 테스트</title>
  <script language="javascript" type="text/javascript" src="js/sign.js"></script>
</head>
<body>
  <h2>전자서명 테스트</h2>
  <form name="form0" action="#">
    서명을 위한 원문<br />
    <textarea id="plain" type="text" name="plain"></textarea><br />
    <input type="button" onclick="document.getElementById('signed_msg').value = signDigest(document.getElementById('plain').value);" value="전자서명" /><br />
    <hr />
    전자서명문<br />
    <textarea id="signed_msg"></textarea>
  </form>
</body>
</html>

위에 포함된. sign.js 파일

function signDigest(text) {
    if ( window.event ) {
        window.event.cancelBubble = true;
    }

    var dest = sign(text); //TODO
    //alert(dest);
    return dest;
}

// CAPICOM constants
var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;
var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_E_CANCELLED = -2138568446;
var CERT_KEY_SPEC_PROP_ID = 6;

function IsCAPICOMInstalled() {
    if ( typeof(oCAPICOM) == 'object' ) {
        if( ( oCAPICOM.object != null ) ) {
            // We found CAPICOM!
            return true;
        }
    }
}

function FindCertificateByHash() {
    try {
        // instantiate the CAPICOM objects
        var MyStore = new ActiveXObject('CAPICOM.Store');
        // open the current users personal certificate store
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_READ_ONLY);

        // find all of the certificates that have the specified hash
        var FilteredCertificates = MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, strUserCertigicateThumbprint);

        var Signer = new ActiveXObject('CAPICOM.Signer');
        Signer.Certificate = FilteredCertificates.Item(1);
        return Signer;

        // Clean Up
        MyStore = null;
        FilteredCertificates = null;
    } catch ( e ) {
        if (e.number != CAPICOM_E_CANCELLED) {
            return new ActiveXObject('CAPICOM.Signer');
        }
    }
}

function sign(src) {
    if ( window.crypto && window.crypto.signText ) {
        return sign_NS(src);
    }

    return sign_IE(src);
}

function sign_NS(src) {
    var s = crypto.signText(src, 'ask' );
    return s;
}

function sign_IE(src) {
    try {
        // instantiate the CAPICOM objects
        var SignedData = new ActiveXObject('CAPICOM.SignedData');
        var TimeAttribute = new ActiveXObject('CAPICOM.Attribute');

        // Set the data that we want to sign
        SignedData.Content = src;
        var Signer = FindCertificateByHash();

        // Set the time in which we are applying the signature
        var Today = new Date();
        TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
        TimeAttribute.Value = Today.getVarDate();
        Today = null;
        Signer.AuthenticatedAttributes.Add(TimeAttribute);

        // Do the Sign operation
        var szSignature = SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
        return szSignature;
    } catch ( e ) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert('An error occurred when attempting to sign the content, the errot was: ' + e.description);
        }
    }
    return '';
}

위 함수를 사용하면 PKCS#7 으로 인코딩된 전자서명문을 생성할 수 있으며, 서버에서는 bouncy castle라이브러리 등을 통해서 검증을 할 수 있습니다.

crypto.signText 문법

Syntax
crypto.signText
   (text, selectionStyle [, authority1 [, ... authorityN]])

Parameters
text
    A string evaluating to the text you want a user to sign.
selectionStyle
    A string evaluating to either of the following:
        * ask specifies that a dialog box will present a user with a list of possible certificates.
        * auto specifies that Navigator automatically selects a certificate from authority1 through authorityN.
authority1... authorityN
    Optional strings evaluating to Certificate Authorities accepted by the server using the signed text.

weblogic nodemanager 명령 요약

weblogic nodemanager 에 접속하여 명령을 하는 것에 대한 간단한 요약.

telnet 접속의 경우.

telnet wls.dgkim.net 5555
DOMAIN #도메인명#
USER weblogic
PASS #패스워드#
SERVER #서버#
KILL # 종료시.
START # 시작시.

ssl 접속의 경우.

openssl s_client -connect wls.dgkim.net:5556
DOMAIN #도메인명#
USER weblogic
PASS #패스워드#
SERVER #서버#
KILL # 종료시.
START # 시작시.

현재 사용중인 메일(+웹메일)의 기술적 지원사항.

현재 제가 사용하는 메일의 기술적 지원 사항을 나열해 봅니다.

메일

기본적인 메일 서버로서의 고려사항.

1. SMTP/SMTP with SSL : 사용가능. 단, 현재 IP주소를 ISP의 가정용(?) 대역이라 일부 메일 서버에서는 차단될 수 있습니다.
2. POP3/POP3 with SSL : POP3는 제공하는 기능의 한계로 인해 사용하지 않습니다.
3. IMAP/IMAP with SSL : IMAP with SSL로 기본적으로 접근하여 사용합니다.
4. Authentication : LDAP 연동하여 계정인증을 하고 있습니다.
5. Accounting : LDAP에 연계하여 사용하면 좋을 것이나, 현재는 unix 계정에 연계하여 메일을 받고 있습니다. ( 혹, 바꿨나 기억나지 않네요. )
6. Mail box : 편지함의 경우 개인 받은 편지함의 경우 수동으로 생성하며, 한번 생성후 자신의 편지함은 본인이 생성 및 삭제 가능합니다.
7. Mailbox sharing : 개인의 받은편지함 및 개인이 생성한 편지함에 대하여 편지함 단위로 개별 사용자에 대한 권한을 줄 수 있습니다. 단, 사용자가 관리하는 인터페이스는 없고, unix 명령으로만 해봤습니다.
8. group mail : 메일링 리스트와 같은 group mail은 unix에서 임의로 생성하여 사용하는 것은 가능하나, 관리가 편리한 메일링 프로그램과 연계는 하지 않았습니다.
9. SPAM Filter : 현재 서버측 스팸필터는 사용하지 않습니다. 클라이언트에서 thunderbird에서 제공하는 스팸 필터를 사용하고 있습니다.

웹메일과 소소한 기능

웹메일에서 기능으로 중시여기는 것들.

1. Authentication : LDAP백엔드를 사용하며, Web form 인증을 사용합니다.
2. 메일서버 선택 : 메일 백엔드 서버는 현재 웹메일 관리 페이지에서 지정할 수 있으며, 지정된 서버목록에서 사용자가 선택하여 로그인 가능합니다. ( 당연히, 메일서버는 IMAP 등으로 연계됩니다. )
3. 주소 : 주소록프로그램과 연계되어 사용되며, 주소록은 LDAP 백엔드를 사용하여 사용중입니다. 메일 작성시 이름을 입력하여 자동으로 주소와 연계하는 것은 가능하나, 한글에 대해서는 기대되는 성능을 내지 못합니다.
4. HTML 메일 : 자체 HTML에디터(html+css+javascript)를 제공하며 사용자가 선택하여 사용가능합니다.
5. SMIME 메일 : 개인 인증서를 통해서 SMIME 서명 및 암호화 메일을 발송할 수 있습니다. LDAP에 사용자 인증서를 등록한 경우, 메일 작성시 캐시에 없을 경우 LDAP에 자동으로 접근하여 인증서를 가져옵니다.
6. PGP 메일 : PGP 가능하나 현재 PGP 키를 잘 사용하지 않고 있습니다.
7. SPAM Filter : 자동화된 스팸 차단 기능은 사용하지 않으며, blacklist등을 통해서 filtering은 가능합니다.
8. Filtering : 개인이 보인의 메일 필터 규칙을 추가하여 사용 가능합니다.
9. 찾기 : 찾기 인터페이스를 통해서 검색은 가능하나, 한글이나 첨부파일에 대한 검색은 잘 안되리라 생각되며, 웹메일의 검색 기능보다는 thunderbird와 같은 클라이언트 프로그램에서 주로 검색합니다.
10. RSVP : 자체 캘린더를 제공하며, RSVP 초대 메일에 대한 연계 기능을 제공합니다.
11. 대용량 메일 : 첨부파일이 대용량인 경우 서버에 파일을 저장하고 링크를 보내는 대용량 메일 기능을 제공합니다.
12. 첨부파일 지원 : zip 첨부파일의 경우 자체 압축해제를 통해 웹으로 zip파일에 포함된 파일 목록을 볼 수 있습니다. 단, 한글 파일명에 대해서는 제대로 동작하지 않습니다.
13. 납치태그 : 기본적으로 메일보기에서는 plain text형태로 보여주며, html 메시지의 경우 이미지 차단이나 납치태그에 대한 차단이 기본적으로 제공됩니다.
14. 드래그앤드롭 파일업로드 : 메일작성시 아직은 드래그앤드롭으로 파일첨부가 불가능합니다.

ps. 이 글은 제가 생각하기에 필요하다고 느끼는 것에 대하여 간추려 올린 것입니다. 추가적으로 필요하다고 생각되는 것이 있으시면, 주저 없이 코멘트 달아 주십시오.