ASP: WinHttp.WinHttpRequest.5.1을 이용해서 https 사이트 접속하기

ASP에서 Client Certificate을 요구하는 https 사이트를 접속하는 방법을 소개하고자 한다.

인증서가 서버에 설치되어 있고, 경로는 LOCAL_MACHINE\My\MyCertificate라고 가정을 하고 다음의 페이지를 만들어서 브라우져로 접속을 해보자.

<%
sUrl = "https://svcs.sandbox.paypal.com/AdaptiveAccounts/GetVerifiedStatus"
sPostData = "test=test"

Set oHTTP = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.SetClientCertificate("LOCAL_MACHINE\My\MyCertificate")
oHTTP.open "POST", sUrl, FALSE
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHTTP.send sPostData
sHtml = oHTTP.ResponseText
Response.Write sHtml
%>

위에서 6번째 줄 oHTTP.SetClientCertificate(“LOCAL_MACHINE\My\MyCertificate”) 이 핵심이다.

브라우져 접속시 두가지 오류가 발생할 가능성이 있다.

WinHttp.WinHttpRequest error ’80072f0c’.

A certificate is required to complete client authentication.

이 오류는 Certificate 경로에 문제가 있는 경우이다. LOCAL_MACHINE\My\MyCertificate을 확인해 봐야 한다.

WinHttp.WinHttpRequest error ’80072f8f’

A security error occurred.

이 오류는 웹서버(IIS)의 실행 유저(IUSR_MACHINENAME, IWAM_MACHINENAME)가 Certificate의 Private Key을 접근하지 못해서 발생하는 에러이다. 해결 방법은 WinHttpCertCfg.exe를 이용해서 다음의 방법으로 사용자에게 권한을 부여하면 된다.

winhttpcertcfg -g -c LOCAL\_MACHINE\My -s MyCertificate -a IWAM\_TESTMACHINE

부여된 권한을 확인하는 방법은

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -l

VBScript: 크기가 정해지지 않은 DynamicArray 클래스

DynamicArray 클래스

Class DynamicArray
    '************** Properties **************
    Private aData
    '****************************************

    '*********** Event Handlers *************
    Private Sub Class_Initialize()
        Redim aData(0)
    End Sub
    '****************************************

    '************ Property Get **************
    Public Property Get Data(iPos)
        'Make sure the end developer is not requesting an
        '"out of bounds" array element
        If iPos < LBound(aData) or iPos > UBound(aData) then
            Exit Property    'Invalid range
        End If

        Data = aData(iPos)
    End Property

    Public Property Get DataArray()
        DataArray = aData
    End Property
    '****************************************

    '************ Property Let **************
    Public Property Let Data(iPos, varValue)
        'Make sure iPos >= LBound(aData)
        If iPos < LBound(aData) Then Exit Property

        If iPos > UBound(aData) then
            'We need to resize the array
            Redim Preserve aData(iPos)
            aData(iPos) = varValue
        Else
            'We don't need to resize the array
            aData(iPos) = varValue
        End If
    End Property
    '****************************************

    '************** Methods *****************
    Public Function StartIndex()
        StartIndex = LBound(aData)
    End Function

    Public Function StopIndex()
        StopIndex = UBound(aData)
    End Function

    Public Sub Delete(iPos)
        'Make sure iPos is within acceptable ranges
        If iPos < LBound(aData) or iPos > UBound(aData) then
            Exit Sub    'Invalid range
        End If

        Dim iLoop
        For iLoop = iPos to UBound(aData) - 1
            aData(iLoop) = aData(iLoop + 1)
        Next

        Redim Preserve aData(UBound(aData) - 1)
    End Sub
    '****************************************
End Class

출처: http://www.4guysfromrolla.com/webtech/032800-1.shtml

ASP에서 SQLite 사용하기

http://www.ch-werner.de/sqliteodbc/ 에서 SQLite ODBC Driver를 다운받아 설치한다.

다음 형태의 커넥션 문자열을 이용하여 SQLite를 사용한다.
DRIVER=SQLite3 ODBC Driver;Database=mydb.sqlite;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;
Database= 다음에 DB 파일의 경로를 입력해 주면 된다. 그 외의 옵션은 무슨 내용인지 알 길이 없다.
테스트를 해보니 SELECT는 엄청 빠른데 INSERT는 10개의 레코드를 추가하는데 1초 이상이 걸린다. 너무 느린데, 뭔가 잘못 되어 있나???
잘못되어 있는게 아니라 SQLite가 File 기반이다 보니 매번 INSERT가 일어날 때마다 File에 Write를 해서 느리다.