Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 6개 있습니다.)

"Let's Encrypt"에서 제공하는 무료 SSL 인증서를 IIS에 적용하는 방법 (1)

드디어, "Let's Encrypt"가 베타를 벗어나 정식 서비스로 들어갔습니다.

Let's Encrypt
; https://letsencrypt.org/getting-started/

게다가 IIS를 위한 PowerShell 모듈도 ebekker라는 사용자가 github에 공개했습니다.

How Letsencrypt work for windows IIS? 
; https://community.letsencrypt.org/t/how-letsencrypt-work-for-windows-iis/2106/1

ebekker/ACMESharp 
; https://github.com/ebekker/ACMESharp/wiki/Quick-Start

어디... 한번 써볼까요? ^^

방법은 이미 ACMESharp 위키 페이지에 다 있지만 그래도 여기서 다시 한번 설명해 보겠습니다.

먼저, "ACMESharp"은 PowerShell 모듈이기 때문에 (관리자 권한의) PowerShell 쉘에서 다음과 같은 명령어로 설치해줍니다.

Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> Install-Module -Name ACMESharp

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet
 provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\Tester\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by
running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install
and import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): y

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): y

그럼, 다음의 폴더에 모듈이 설치됩니다.

C:\Program Files\WindowsPowerShell\Modules\ACMESharp\[버전]

완료되었으면 Import-Module로 확인합니다.

PS C:\WINDOWS\system32> Import-Module ACMESharp

PS C:\WINDOWS\system32>

참고로, 위의 명령어는 PowerShell Gallery로부터 ACMESharp을 설치하는 것인데 이는 PowerShell 5.0부터 지원됩니다. 윈도우 10부터는 5.0 버전이 기본 설치되어 있지만 윈도우 7 SP1 부터는 별도로 설치해줘야 합니다.

Windows Management Framework 5.0 
; https://www.microsoft.com/en-us/download/details.aspx?id=50395

설치된 PowerShell의 버전을 알고 싶다면 Get-Host 명령으로 확인할 수 있습니다.

PS C:\Users\Tester> Get-Host


Name             : ConsoleHost
Version          : 5.0.10586.122
InstanceId       : d200e2f8-636f-41a5-b0d8-6714390c59b3
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : ko-KR
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

그다음, 인증서를 저장하기 위한 영역을 초기화해줍니다. 이 명령을 관리자 권한으로 실행하면 시스템 전역적인 경로에 인증서 관련 정보가 저장되고, 그렇지 않다면 사용자 관련 경로에 저장됩니다. 저는, 그냥 '비-관리자 권한'으로 다시 PowerShell을 실행시켜 Vault 저장소를 초기화시켰습니다.

PS C:\Users\Tester> Initialize-ACMEVault

그럼, 관련 파일이 다음의 경로에 생성됩니다.

%LOCALAPPDATA%\ACMESharp\userVault

이제 "Let's Encrypt"에 등록을 하고,

PS C:\Users\Tester> New-ACMERegistration -Contacts mailto:kevin13@chol.net -AcceptTos


Contacts          : {mailto:kevin13@chol.net}
PublicKey         : { e = AQAB, kty = RSA, n = ...[생략]... }
RecoveryKey       :
RegistrationUri   : https://acme-v01.api.letsencrypt.org/acme/reg/1610295
Links             : {...[생략]...}
TosLinkUri        : https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf
TosAgreementUri   : https://letsencrypt.org/documents/LE-SA-v1.0.1-July-27-2015.pdf
AuthorizationsUri :
CertificatesUri   :

인증서를 적용할 웹 사이트의 DNS 명을 제출합니다.

PS C:\Users\Tester> New-ACMEIdentifier -Dns www.sysnet.pe.kr -Alias myblogdns1


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : www.sysnet.pe.kr
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/...[생략]...
Status         : pending
Expires        : 2016-05-10 오후 2:45:01
Challenges     : {, , }
Combinations   : {2, 1, 0}

제출한 DNS 명이 여러분 소유라는 것을 이제 증명해야 하는데요. 다음의 3가지 방법이 있습니다.

  • If you want to handle the HTTP Challenge using Windows IIS, use Method #1.
  • If you want to handle the HTTP Challenge manually, use Method #2.
  • If you want to handle the DNS Challenge manually, use Method #3

제 경우에는, Azure에 올려진 제 블로그에 적용할 것이므로 수작업으로 진행해야 하므로 두 번째 방법을 택했습니다.

PS C:\Users\Tester> Complete-ACMEChallenge myblogdns1 -ChallengeType http-01 -Handler manual
== Manual Challenge Handler - HTTP ==
  * Handle Time:      [2016-05-03 오후 11:53:01]
  * Challenge Token:  [WRY1jLcW...[생략]...i_2sBI8s]
To complete this Challenge please create a new file
under the server that is responding to the hostname
and path given with the following characteristics:
  * HTTP URL:     [https://www.sysnet.pe.kr/.well-known/acme-challenge/WRY1jLc...[생략]...Ii_2sBI8s]
  * File Path:    [.well-known/acme-challenge/WRY1jLcW...[생략]...2sBI8s]
  * File Content: [WRY1jLcWYcVO55...[생략]...jB_NHLhicrfTj2Bo]
  * MIME Type:    [text/plain]
------------------------------------


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : www.sysnet.pe.kr
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/...[생략]...
Status         : pending
Expires        : 2016-05-10 오후 2:45:01
Challenges     : {, , manual}
Combinations   : {2, 1, 0}

위의 메시지에 대한 의미는 간단합니다. "HTTP URL"이 여러분들의 웹 사이트이므로 "https://www.sysnet.pe.kr/.well-known/acme-challenge/WRY1jLc...[생략]...Ii_2sBI8s" 경로를 방문하면 "File Content"로 지정된 내용인 "WRY1jLcWYcVO55...[생략]...jB_NHLhicrfTj2Bo"을 반환할 수 있도록 파일을 생성해 주면 됩니다. (잊지 말고, Visual Studio의 속성 창에서 해당 파일의 "Build Action"을 "Content"로 설정합니다. 그렇지 않으면 배포에 포함되지 않습니다.)

단지, 해당 파일이 확장자가 없기 때문에 "text/plain"으로 인식해 주려면 .well-known/acme-challenge/ 폴더에 web.config 파일도 함께 생성해서 다음과 같은 설정을 추가해 줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <staticContent>
            <mimeMap fileExtension="." mimeType="text/plain" />
        </staticContent>
    </system.webServer>
</configuration>

확인을 위해 꼭 웹 브라우저로 "https://www.sysnet.pe.kr/.well-known/acme-challenge/WRY1jLc...[생략]...Ii_2sBI8s" 경로를 방문해 보고 "F12" 키를 눌러 "Developer Tools"의 "Network" 탭을 이용해 해당 파일의 "Content type"이 "text/plain"으로 나오는지 보면 좋습니다.

준비가 되었으면 도메인의 소유자임을 "Let's encrypt" 측에 확인하라고 다음의 명령을 내려줍니다.

PS C:\Users\Tester> Submit-ACMEChallenge myblogdns1 -ChallengeType http-01


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : www.sysnet.pe.kr
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/8c7cHBK5xMF8SEDc0t9KT_OYok6OFEaI5uWqgxfpNQg
Status         : pending
Expires        : 2016-05-10 오후 2:45:01
Challenges     : {, , manual}
Combinations   : {2, 1, 0}

보시면 상태가 "pending"으로 나옵니다. 이게 완료될 때까지 기다려야 하는데요. 다음의 명령어로 한번씩 확인해 볼 수 있습니다. (금방 상태가 확정됩니다.)

PS C:\Users\Tester> (Update-ACMEIdentifier myblogdns1 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}


ChallengePart          : ACMESharp.Messages.ChallengePart
Challenge              : ACMESharp.ACME.HttpChallenge
Type                   : http-01
Uri                    : https://acme-v01.api.letsencrypt.org/acme/challenge/8c7cHBK5xMF8SEDc0t9KT_OYok6OFEaI5uWqgxfpNQg/69449312
Token                  : WRY1jLcWYcVO55PhB1h6fUTzUQs1uRbaGsIi_2sBI8s
Status                 : invalid
OldChallengeAnswer     : [, ]
ChallengeAnswerMessage :
HandlerName            : manual
HandlerHandleDate      : 2016-05-03 오후 11:53:01
HandlerCleanUpDate     :
SubmitDate             : 2016-05-04 오전 12:59:08
SubmitResponse         : {StatusCode, Headers, Links, RawContent...}

저렇게 invalid로 나오면, "New-ACMEIdentifier" 단계로 돌아가서 다시 진행해야 합니다. 따라서, 이렇게 되면 Identifier까지 변경해야 하므로 다음과 같이 이름을 바꿔서 다시 진행해 줍니다.

PS C:\Users\Tester> New-ACMEIdentifier -Dns www.sysnet.pe.kr -Alias myblogdns2


IdentifierPart : ACMESharp.Messages.IdentifierPart
IdentifierType : dns
Identifier     : www.sysnet.pe.kr
Uri            : https://acme-v01.api.letsencrypt.org/acme/authz/EY0wWw0bW1qdwATTtEwZrvzB8UJBi7nIjl7BeIata88
Status         : pending
Expires        : 2016-05-10 오후 4:10:00
Challenges     : {, , }
Combinations   : {1, 0, 2}

참고로, 제 경우에 "invalid"로 나왔던 원인은 해당 파일이 "UTF-8 with signature" 형식으로 저장되어 발생한 문제였습니다. 그래서 "ASCII" 형식으로 메모장을 이용해 다시 저장한 후 웹 사이트를 배포해 "Status: valid" 상태까지 진행했습니다.

PS C:\Users\Tester> (Update-ACMEIdentifier myblogdns2 -ChallengeType http-01).Challenges | Where-Object {$_.Type -eq "http-01"}


ChallengePart          : ACMESharp.Messages.ChallengePart
Challenge              : ACMESharp.ACME.HttpChallenge
Type                   : http-01
Uri                    : https://acme-v01.api.letsencrypt.org/acme/challenge/EY0wWw0bW1qdwATTtEwZrvzB8UJBi7nIjl7BeIata8
                         8/69514095
Token                  : 3lA782rH5W43rIX_rTwi3zSdjPRgILkajdKAIfnH2y8
Status                 : valid
OldChallengeAnswer     : [, ]
ChallengeAnswerMessage :
HandlerName            : manual
HandlerHandleDate      : 2016-05-04 오전 1:10:38
HandlerCleanUpDate     :
SubmitDate             : 2016-05-04 오전 1:21:29
SubmitResponse         : {StatusCode, Headers, Links, RawContent...}

드디어, 인증서를 받을 차례가 왔군요. ^^ 로컬에 인증서를 하나 만들고 그것을 "Let's encrypt" 측 CA 서버에 전달합니다.

PS C:\Users\Tester> New-ACMECertificate myblogdns2 -Generate -Alias sysnetCert1


Id                       : 2117d473-8887-4a0d-94c4-dcedb23c591b
Alias                    : sysnetCert1
Label                    :
Memo                     :
IdentifierRef            : b96ca243-869e-422e-8c15-e63aaca5bba5
IdentifierDns            : www.sysnet.pe.kr
AlternativeIdentifierDns :
KeyPemFile               :
CsrPemFile               :
GenerateDetailsFile      : 2117d473-8887-4a0d-94c4-dcedb23c591b-gen.json
CertificateRequest       :
CrtPemFile               :
CrtDerFile               :
IssuerSerialNumber       :
SerialNumber             :
Thumbprint               :
Signature                :
SignatureAlgorithm       :


PS C:\Users\Tester> Submit-ACMECertificate sysnetCert1


Id                       : 2117d473-8887-4a0d-94c4-dcedb23c591b
Alias                    : sysnetCert1
Label                    :
Memo                     :
IdentifierRef            : b96ca243-869e-422e-8c15-e63aaca5bba5
IdentifierDns            : www.sysnet.pe.kr
AlternativeIdentifierDns :
KeyPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-key.pem
CsrPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-csr.pem
GenerateDetailsFile      : 2117d473-8887-4a0d-94c4-dcedb23c591b-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.pem
CrtDerFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.der
IssuerSerialNumber       :
SerialNumber             : 036803E45525487CD7F7E1030337C3070F08
Thumbprint               : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
Signature                : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
SignatureAlgorithm       : sha256RSA

PS C:\Users\Tester> Update-ACMECertificate sysnetCert1


Id                       : 2117d473-8887-4a0d-94c4-dcedb23c591b
Alias                    : sysnetCert1
Label                    :
Memo                     :
IdentifierRef            : b96ca243-869e-422e-8c15-e63aaca5bba5
IdentifierDns            : www.sysnet.pe.kr
AlternativeIdentifierDns :
KeyPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-key.pem
CsrPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-csr.pem
GenerateDetailsFile      : 2117d473-8887-4a0d-94c4-dcedb23c591b-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.pem
CrtDerFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 036803E45525487CD7F7E1030337C3070F08
Thumbprint               : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
Signature                : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
SignatureAlgorithm       : sha256RSA


정상적으로 인증서가 발급되었으니, 이제 pfx 파일로 export 시킨 다음,

PS C:\Users\Tester> Get-ACMECertificate sysnetCert1 -ExportPkcs12 "c:\temp\sysnetCert1.pfx" -CertificatePassword 'mypassword'


Id                       : 2117d473-8887-4a0d-94c4-dcedb23c591b
Alias                    : sysnetCert1
Label                    :
Memo                     :
IdentifierRef            : b96ca243-869e-422e-8c15-e63aaca5bba5
IdentifierDns            : www.sysnet.pe.kr
AlternativeIdentifierDns :
KeyPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-key.pem
CsrPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-csr.pem
GenerateDetailsFile      : 2117d473-8887-4a0d-94c4-dcedb23c591b-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.pem
CrtDerFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 036803E45525487CD7F7E1030337C3070F08
Thumbprint               : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
Signature                : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
SignatureAlgorithm       : sha256RSA

파일로 나온 sysnetCert1.pfx 인증서를 IIS 서버에 설치해 주면 됩니다.

IIS 서버는 나중에 적용해 보고, 우선 내보내기 된 .pfx파일을 탐색기에서 더블 클릭을 이용한 '가져오기'로 다음의 글에 설명한 방법으로 설치할 수 있습니다.

5.1 인증서 관리 - 내보내기/가져오기
; https://www.sysnet.pe.kr/2/0/392

.pfx 파일을 가져오기 했으면 이제 '인증서 관리자'를 통해 살펴볼 수 있습니다.

5.3 인증서 관리 - 인증서 MMC 관리자
; https://www.sysnet.pe.kr/2/0/395

아래의 그림에서 보는 것처럼,

letsencrypt_1.png

letsencrypt_2.png

오직, HTTPS 관련 통신을 위한 보안 용도로만 사용할 수 있을 뿐 그 외의 '코드 사이닝'과 같은 용도로는 사용할 수 없습니다.

마지막으로 인증 경로는 다음과 같습니다.

letsencrypt_3.png

  • DST Root CA X3
  • Let's Encrypt Authority X3
  • ...[your cert]....




참고로, 오류가 발생했던 경우 하나를 공유합니다. 다음과 같이 pfx 내보내기에서 오류가 발생했는데요.

PS C:\Users\Tester> Get-ACMECertificate sysnetCert1 -ExportPkcs12 "c:\temp\sysnetCert1.pfx" -CertificatePassword 'mypassword'
Get-ACMECertificate : Cannot export PKCS12; Issuer certificate hasn't been resolved
At line:1 char:1
+ Get-ACMECertificate sysnetCert1 -ExportPkcs12 "c:\temp\sysnetCert1.pf ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-ACMECertificate], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.GetCertificate

Submit-ACMECertificate 명령어의 결과에 다음과 같이 IssuerSerialNumber가 비어 있는데 아마 처리가 완료되지 않은 탓으로 보입니다.

PS C:\Users\Tester> Submit-ACMECertificate sysnetCert1


Id                       : 2117d473-8887-4a0d-94c4-dcedb23c591b
Alias                    : sysnetCert1
Label                    :
Memo                     :
IdentifierRef            : b96ca243-869e-422e-8c15-e63aaca5bba5
IdentifierDns            : www.sysnet.pe.kr
AlternativeIdentifierDns :
KeyPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-key.pem
CsrPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-csr.pem
GenerateDetailsFile      : 2117d473-8887-4a0d-94c4-dcedb23c591b-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.pem
CrtDerFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.der
IssuerSerialNumber       :
SerialNumber             : 036803E45525487CD7F7E1030337C3070F08
Thumbprint               : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
Signature                : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
SignatureAlgorithm       : sha256RSA

검색해 보니,

Cannot export PKCS12; Issuer certificate hasn't been resolved #87
; https://github.com/ebekker/ACMESharp/issues/87

Update-ACMECertificate 명령어를 해주라는 말이 나와서 실행했는데, 이번에는 IssuerSerialNumber의 값이 채워져 있었습니다.

PS C:\Users\Tester> Update-ACMECertificate sysnetCert1


Id                       : 2117d473-8887-4a0d-94c4-dcedb23c591b
Alias                    : sysnetCert1
Label                    :
Memo                     :
IdentifierRef            : b96ca243-869e-422e-8c15-e63aaca5bba5
IdentifierDns            : www.sysnet.pe.kr
AlternativeIdentifierDns :
KeyPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-key.pem
CsrPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-csr.pem
GenerateDetailsFile      : 2117d473-8887-4a0d-94c4-dcedb23c591b-gen.json
CertificateRequest       : ACMESharp.CertificateRequest
CrtPemFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.pem
CrtDerFile               : 2117d473-8887-4a0d-94c4-dcedb23c591b-crt.der
IssuerSerialNumber       : 0A0141420000015385736A0B85ECA708
SerialNumber             : 036803E45525487CD7F7E1030337C3070F08
Thumbprint               : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
Signature                : CC5D8A0EBA4C72BB42308A851261A3FBFCBC115E
SignatureAlgorithm       : sha256RSA

따라서, 저 값이 제대로 채워져 있는지 검사한 후에 인증서 내보내기를 하면 잘 될 것입니다.




좋은 참고 자료가 있는데요. 아래는 동영상으로 이 글의 내용을 소개하고 있습니다.

March 2016: How to install Let's Encrypt Free SSL certificates on Windows Server and IIS 
; https://www.youtube.com/watch?v=tohX24vUnW8

그리고, "Let's Encrypt"를 위한 Azure 사이트 확장도 있습니다.

Azure Let's Encrypt (x86)
; https://www.siteextensions.net/packages/letsencrypt/

Azure Let's Encrypt (x64)
; https://www.siteextensions.net/packages/letsencrypt64/





[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/28/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2016-06-08 04시20분
[웅이] 엄청나군요~ㅎ
[guest]
2017-06-22 07시24분
[미정] 혹시 3개월마다 자동갱신되도록 할 수는 없나요?
[guest]
2017-06-22 12시38분
저도 안 해봤지만, 다음의 글을 참고하세요.

Managing LetsEncrypt Certificate expiration and auto-renewals
; https://superuser.com/questions/1043761/managing-letsencrypt-certificate-expiration-and-auto-renewals

A Simple ACME Client for Windows
; https://github.com/Lone-Coder/letsencrypt-win-simple
정성태

... 16  17  18  19  20  21  22  23  24  25  26  27  [28]  29  30  ...
NoWriterDateCnt.TitleFile(s)
12921정성태1/14/20225626개발 환경 구성: 624. Docker Desktop에서 별도 서버에 설치한 docker registry에 이미지 올리는 방법
12920정성태1/14/20226395오류 유형: 786. Camtasia - An error occurred with the camera: Failed to Add Video Sampler.
12919정성태1/13/20226224Windows: 199. Host Network Service (HNS)에 의해서 점유되는 포트
12918정성태1/13/20226442Linux: 47. WSL - shell script에서 설정한 환경 변수가 스크립트 실행 후 반영되지 않는 문제
12917정성태1/12/20225671오류 유형: 785. C# - The type or namespace name '...' could not be found (are you missing a using directive or an assembly reference?)
12916정성태1/12/20225406오류 유형: 784. TFS - One or more source control bindings for this solution are not valid and are listed below.
12915정성태1/11/20225675오류 유형: 783. Visual Studio - We didn't find any interpreters
12914정성태1/11/20227576VS.NET IDE: 172. 비주얼 스튜디오 2022의 파이선 개발 환경 지원
12913정성태1/11/20228118.NET Framework: 1133. C# - byte * (바이트 포인터)를 FileStream으로 쓰는 방법 [1]
12912정성태1/11/20228745개발 환경 구성: 623. ffmpeg.exe를 사용해 비디오 파일의 이미지를 PGM(Portable Gray Map) 파일 포맷으로 출력하는 방법 [1]
12911정성태1/11/20226097VS.NET IDE: 171. 비주얼 스튜디오 - 더 이상 만들 수 없는 "ASP.NET Core 3.1 Web Application (.NET Framework)" 프로젝트
12910정성태1/10/20226559제니퍼 .NET: 30. 제니퍼 닷넷 적용 사례 (8) - CPU high와 DB 쿼리 성능에 문제가 함께 있는 사이트
12909정성태1/10/20227959오류 유형: 782. Visual Studio 2022 설치 시 "Couldn't install Microsoft.VisualCpp.Redist.14.Latest"
12908정성태1/10/20225814.NET Framework: 1132. C# - ref/out 매개변수의 IL 코드 처리
12907정성태1/9/20226249오류 유형: 781. (youtube-dl.exe) 실행 시 "This app can't run on your PC" / "Access is denied." 오류 발생
12906정성태1/9/20226858.NET Framework: 1131. C# - 네임스페이스까지 동일한 타입을 2개의 DLL에서 제공하는 경우 충돌을 우회하는 방법 [1]파일 다운로드1
12905정성태1/8/20226520오류 유형: 780. Could not load file or assembly 'Microsoft.VisualStudio.TextTemplating.VSHost.15.0, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
12904정성태1/8/20228552개발 환경 구성: 623. Visual Studio 2022 빌드 환경을 위한 github Actions 설정 [1]
12903정성태1/7/20227147.NET Framework: 1130. C# - ELEMENT_TYPE_INTERNAL 유형의 사용 예
12902정성태1/7/20227181오류 유형: 779. SQL 서버 로그인 에러 - provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.
12901정성태1/5/20227273오류 유형: 778. C# - .NET 5+에서 warning CA1416: This call site is reachable on all platforms. '...' is only supported on: 'windows' 경고 발생
12900정성태1/5/20228921개발 환경 구성: 622. vcpkg로 ffmpeg를 빌드하는 경우 생성될 구성 요소 제어하는 방법
12899정성태1/3/20228406개발 환경 구성: 621. windbg에서 python 스크립트 실행하는 방법 - pykd (2)
12898정성태1/2/20228958.NET Framework: 1129. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 인코딩 예제(encode_video.c) [1]파일 다운로드1
12897정성태1/2/20227840.NET Framework: 1128. C# - 화면 캡처한 이미지를 ffmpeg(FFmpeg.AutoGen)로 동영상 처리 [4]파일 다운로드1
12896정성태1/1/202210709.NET Framework: 1127. C# - FFmpeg.AutoGen 라이브러리를 이용한 기본 프로젝트 구성파일 다운로드1
... 16  17  18  19  20  21  22  23  24  25  26  27  [28]  29  30  ...