.NET의 플랫폼 간 암호화
.NET의 암호화 작업은 OS(운영 체제) 라이브러리에 의해 수행됩니다. 이 종속성은 다음과 같은 장점이 있습니다.
- .NET 앱은 OS 안정성의 이점을 얻습니다. 암호화 라이브러리를 취약성으로부터 안전하게 보호하는 것은 OS 공급업체의 최우선 과제입니다. 이를 위해 시스템 관리자가 적용해야 하는 업데이트를 제공합니다.
- OS 라이브러리가 FIPS 유효성 검사된 경우 .NET 앱은 FIPS 유효성 검사 알고리즘에 액세스할 수 있습니다.
OS 라이브러리에 대한 종속성은 .NET 앱이 OS가 지원하는 암호화 기능만 사용할 수 있음을 의미합니다. 모든 플랫폼은 특정 핵심 기능을 지원하지만 .NET이 지원하는 일부 기능은 일부 플랫폼에서 사용할 수 없습니다. 이 문서에서는 각 플랫폼에서 지원되는 기능을 식별합니다.
이 문서에서는 사용자가 .NET의 암호화 작업에 익숙하다고 가정합니다. 자세한 내용은 .NET 암호화 모델 및 .NET 암호화 서비스를 참조하세요.
해시 및 메시지 인증 알고리즘
*Managed
클래스를 포함한 모든 해시 알고리즘 및 HMAC(해시 기반 메시지 인증 코드) 클래스는 브라우저 WASM의 .NET을 제외하고 OS 라이브러리를 따릅니다. 브라우저 WASM에서 SHA-1, SHA-2-256, SHA-2-384, SHA-2-512 및 HMAC 상당 항목은 관리 코드를 사용하여 구현됩니다.
알고리즘 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | 브라우저 |
---|---|---|---|---|---|---|
MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
SHA-3-2561 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
SHA-3-3841 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
SHA-3-5121 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
SHAKE-1281 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1+3 | ❌ | ❌ | ❌ | ❌ |
SHAKE-2561 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1+3 | ❌ | ❌ | ❌ | ❌ |
HMAC-MD5 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
HMAC-SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-256 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-384 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-2-512 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
HMAC-SHA-3-2561 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-3841 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
HMAC-SHA-3-5121 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
KMAC-1282 | Windows 11 빌드 26016+ | OpenSSL 3.0 이상 | ❌ | ❌ | ❌ | ❌ |
KMAC-2562 | Windows 11 빌드 26016+ | OpenSSL 3.0 이상 | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-1282 | Windows 11 빌드 26016+ | OpenSSL 3.0 이상 | ❌ | ❌ | ❌ | ❌ |
KMAC-XOF-2562 | Windows 11 빌드 26016+ | OpenSSL 3.0 이상 | ❌ | ❌ | ❌ | ❌ |
1.NET 8부터 사용할 수 있습니다.
2.NET 9부터 사용할 수 있습니다.
3.NET 9부터 XOF(스트리밍 확장 가능 출력 함수)를 사용할 수 있습니다. Linux에서는 OpenSSL 3.3이 필요합니다.
대칭 암호화
기본 암호 및 연결은 시스템 라이브러리에 의해 수행됩니다.
암호화 + 모드 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
AES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
AES-CFB128 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
3DES-CFB64 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
DES-CFB8 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
RC2-CBC | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-ECB | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
RC2-CFB | ❌ | ❌ | ❌ | ❌ | ❌ |
인증된 암호화
AE(인증된 암호화) 지원은 각각 System.Security.Cryptography.AesCcm, System.Security.Cryptography.AesGcm 및 System.Security.Cryptography.ChaCha20Poly1305 클래스를 통해 AES-CCM, AES-GCM 및 ChaCha20Poly1305에 제공됩니다.
인증 암호화는 알고리즘을 지원하기 위해 최신 플랫폼 API가 필요하므로 일부 플랫폼에서는 지원되지 않을 수 있습니다. 알고리즘 클래스의 IsSupported
정적 속성을 사용하면 런타임 시 현재 플랫폼이 알고리즘을 지원하는지 여부를 검색할 수 있습니다.
암호화 + 모드 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android | 브라우저 |
---|---|---|---|---|---|---|
AES-GCM | ✔️ | ✔️ | ⚠️ | ⚠️ | ✔️ | ❌ |
AES-CCM | ✔️ | ✔️ | ⚠️ | ❌ | ✔️ | ❌ |
ChaCha20Poly1305 | Windows 10 빌드 20142 이상 | OpenSSL 1.1.0 이상 | ⚠️ | ⚠️ | API Level 28 이상 | ❌ |
macOS의 AES-CCM
macOS에서 시스템 라이브러리는 타사 코드에 대해 AES-CCM을 지원하지 않으므로 AesCcm 클래스는 지원을 위해 OpenSSL을 사용합니다. macOS 사용자는 이 형식이 작동하려면 적절한 OpenSSL(libcrypto) 복사본을 가져와야 하며, 이는 기본적으로 시스템이 라이브러리를 로드하는 경로에 있어야 합니다. Homebrew와 같은 패키지 관리자에서 OpenSSL을 설치하는 것이 좋습니다.
macOS에 포함된 libcrypto.0.9.7.dylib
및 libcrypto.0.9.8.dylib
라이브러리는 이전 버전의 OpenSSL에서 가져온 것이므로 사용되지 않습니다. libcrypto.35.dylib
, libcrypto.41.dylib
및 libcrypto.42.dylib
라이브러리는 LibreSSL에서 제공되며 사용되지 않습니다.
macOS의 AES-GCM 및 ChaCha20Poly1305
macOS는 타사 코드에 대해 macOS 10.15까지 AES-GCM 또는 ChaCha20Poly1305를 지원하지 않았습니다. .NET 8 이전에는 AesGcm 및 ChaCha20Poly1305의 요구 사항이 AES-CCM과 동일하며 이러한 형식이 작동하려면 사용자가 OpenSSL을 설치해야 합니다.
.NET 8부터 macOS의 .NET은 AES-GCM 및 ChaCha20Poly1305에 Apple의 CryptoKit 프레임워크를 사용합니다. 사용자는 macOS에서 AES-GCM 또는 ChaCha20Poly1305에 대한 추가 종속성을 설치하거나 구성할 필요가 없습니다.
iOS, tvOS, MacCatalyst의 AES-GCM 및 ChaCha20Poly1305
AES-GCM 및 ChaCha20Poly1305 지원은 .NET 9부터 iOS 및 tvOS 13.0 이상과 모든 버전의 MacCatalyst에서 사용할 수 있습니다.
AES-CCM 키, nonce 및 태그
키 크기
AES-CCM은 128, 192 및 256비트 키에서 작동합니다.
nonce 크기
AesCcm 클래스는 56, 64, 72, 80, 88, 96 및 104비트(7, 8, 9, 10, 11, 12 및 13바이트) nonce를 지원합니다.
태그 크기
AesCcm 클래스는 32, 48, 64, 80, 96, 112 및 128비트(4, 8, 10, 12, 14 및 16바이트) 태그 만들기 또는 처리를 지원합니다.
AES-GCM 키, nonce 및 태그
키 크기
AES-GCM은 128, 192 및 256비트 키에서 작동합니다.
nonce 크기
AesGcm 클래스는 96비트(12바이트) nonce만 지원합니다.
태그 크기 Windows 및 Linux에서 AesGcm 클래스는 96, 104, 112, 120 및 128비트(12, 13, 14, 15 및 16바이트) 태그 만들기 또는 처리를 지원합니다. Apple 플랫폼에서는 CryptoKit 프레임워크의 제한 때문에 태그 크기가 128비트(16 바이트)로 제한됩니다.
ChaCha20Poly1305 키, nonce 및 태그.
ChaCha20Poly1305는 키, nonce 및 인증 태그의 크기가 고정되어 있습니다. ChaCha20Poly1305는 항상 256비트 키, 96비트(12바이트) nonce, 128비트(16바이트) 태그를 사용합니다.
비대칭 암호화
이 섹션에는 다음 하위 섹션이 포함되어 있습니다.
RSA
RSA(Rivest–Shamir–Adleman) 키 생성은 OS 라이브러리에 의해 수행되며 크기 제한 사항 및 성능 특성이 적용됩니다.
RSA 키 작업은 OS 라이브러리에 의해 수행되며 로드할 수 있는 키 형식은 OS 요구 사항에 따라 다릅니다.
.NET은 "원시"(채워지지 않은) RSA 작업을 노출하지 않습니다.
패딩 및 다이제스트 지원은 플랫폼에 따라 다릅니다.
패딩 모드 | Windows(CNG) | Linux(OpenSSL) | macOS | iOS, tvOS, MacCatalyst | Android | Windows(CAPI) |
---|---|---|---|---|---|---|
PKCS1 암호화 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-1 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
OAEP - SHA-2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
OAEP - SHA-32 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
PKCS1 서명(MD5, SHA-1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
PKCS1 서명(SHA-2) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ⚠️1 |
PKCS1 서명(SHA-3)2 | Windows 11 빌드 25324 이상 | OpenSSL 1.1.1 이상 | ❌ | ❌ | ❌ | ❌ |
PSS | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
1 Windows CAPI(CryptoAPI)는 SHA-2 알고리즘을 사용하는 PKCS1 서명이 가능합니다. 그러나 개별 RSA 개체는 이를 지원하지 않는 CSP(암호화 서비스 공급자)에 로드될 수 있습니다.
2 .NET 8이 필요합니다.
Windows의 RSA
- Windows CAPI(CryptoAPI)는
new RSACryptoServiceProvider()
가 사용될 때마다 사용됩니다. new RSACng()
가 사용될 때마다 Windows CNG(Cryptography API Next Generation)가 사용됩니다.- RSA.Create에서 반환된 개체는 Windows CNG에 의해 내부적으로 구동됩니다. 이러한 Windows CNG 사용은 구현 세부 사항이며 변경될 수 있습니다.
- X509Certificate2의 GetRSAPublicKey 확장 메서드는 RSACng 인스턴스를 반환합니다. RSACng의 사용은 구현 세부 정보이며 변경될 수 있습니다.
- X509Certificate2에 대한 GetRSAPrivateKey 확장 메서드는 현재 RSACng 인스턴스를 선호하지만 RSACng가 키를 열 수 없는 경우 RSACryptoServiceProvider가 시도됩니다. 기본 공급자는 구현 세부 사항이며 변경될 수 있습니다.
RSA 네이티브 상호 운용성
.NET은 프로그램이 .NET 암호화 코드에서 사용하는 OS 라이브러리와 상호 운용될 수 있도록 형식을 노출합니다. 관련된 형식은 플랫폼 간에 변환되지 않으며 필요한 경우에만 직접 사용해야 합니다.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
RSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ⚠️1 | ⚠️1 |
RSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
RSAOpenSsl | ❌ | ✔️ | ⚠️2 | ❌ | ❌ |
1 Windows가 아닌 경우 기존 프로그램과의 호환성을 위해 RSACryptoServiceProvider를 사용할 수 있습니다. 이 경우 명명된 키 열기와 같이 OS 상호 운용성을 요구하는 모든 메서드는 PlatformNotSupportedException을 throw합니다.
2 macOS에서는 OpenSSL이 설치되어 있고 동적 라이브러리 로딩을 통해 적절한 libcrypto dylib를 찾을 수 있는 경우 RSAOpenSsl이 작동합니다. 적절한 라이브러리를 찾을 수 없으면 예외가 throw됩니다.
ECDSA
ECDSA(타원 곡선 디지털 서명 알고리즘) 키 생성은 OS 라이브러리에 의해 수행되며 크기 제한 사항 및 성능 특성이 적용됩니다.
ECDSA 키 곡선은 OS 라이브러리에 의해 정의되며 제한 사항이 적용됩니다.
타원 곡선 | Windows 10 | Windows 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256(secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384(secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521(secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Brainpool 곡선(명명된 곡선) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
다른 명명된 곡선 | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
명시적 곡선 | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
명시적으로 내보내기 또는 가져오기 | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Linux 배포판은 모두 동일한 이름의 곡선을 지원하지 않습니다.
2 명명된 곡선에 대한 지원이 Windows 10의 Windows CNG에 추가되었습니다. 자세한 내용은 CNG 명명된 타원 곡선을 참조하세요. 명명된 곡선은 Windows 7의 세 가지 곡선을 제외하고 이전 버전의 Windows에서는 사용할 수 없습니다.
3 명시적인 곡선 매개 변수를 사용하여 내보내려면 OS 라이브러리 지원이 필요하며 이는 Apple 플랫폼이나 이전 버전의 Windows에서는 사용할 수 없습니다.
4 일부 곡선에 대한 Android 지원은 Android 버전에 따라 다릅니다. Android 배포자는 Android 빌드에서 곡선을 추가하거나 제거하도록 선택할 수도 있습니다.
ECDSA 네이티브 상호 운용성
.NET은 프로그램이 .NET 암호화 코드에서 사용하는 OS 라이브러리와 상호 운용될 수 있도록 형식을 노출합니다. 관련된 형식은 플랫폼 간에 변환되지 않으며 필요한 경우에만 직접 사용해야 합니다.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDsaCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDsaOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* macOS에서는 OpenSSL이 시스템에 설치되어 있고 동적 라이브러리 로딩을 통해 적절한 libcrypto dylib를 찾을 수 있는 경우 ECDsaOpenSsl이 작동합니다. 적절한 라이브러리를 찾을 수 없으면 예외가 throw됩니다.
ECDH
ECDH(타원 곡선 Diffie-Hellman) 키 생성은 OS 라이브러리에 의해 수행되며 크기 제한 사항 및 성능 특성이 적용됩니다.
ECDiffieHellman 클래스는 ECDH 계산의 "원시" 값은 물론 다음 주요 파생 함수를 통해 지원합니다.
- HASH(Z)
- HASH(prepend || Z || append)
- HMAC(key, Z)
- HMAC(key, prepend || Z || append)
- HMAC(Z, Z)
- HMAC(Z, prepend || Z || append)
- Tls11Prf(label, seed)
"원시" 키 파생이 .NET 8에 도입되었습니다.
ECDH 키 곡선은 OS 라이브러리에 의해 정의되며 해당 제한 사항이 적용됩니다.
타원 곡선 | Windows 10 | Windows 7 - 8.1 | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
NIST P-256(secp256r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-384(secp384r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
NIST P-521(secp521r1) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Brainpool 곡선(명명된 곡선) | ✔️ | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
다른 명명된 곡선 | ⚠️2 | ❌ | ⚠️1 | ❌ | ❌ | ⚠️4 |
명시적 곡선 | ✔️ | ❌ | ✔️ | ❌ | ❌ | ✔️ |
명시적으로 내보내기 또는 가져오기 | ✔️ | ❌3 | ✔️ | ❌3 | ❌3 | ✔️ |
1 Linux 배포판은 모두 동일한 이름의 곡선을 지원하지 않습니다.
2 명명된 곡선에 대한 지원이 Windows 10의 Windows CNG에 추가되었습니다. 자세한 내용은 CNG 명명된 타원 곡선을 참조하세요. 명명된 곡선은 Windows 7의 세 가지 곡선을 제외하고 이전 버전의 Windows에서는 사용할 수 없습니다.
3 명시적인 곡선 매개 변수를 사용하여 내보내려면 OS 라이브러리 지원이 필요하며 이는 Apple 플랫폼이나 이전 버전의 Windows에서는 사용할 수 없습니다.
4 일부 곡선에 대한 Android 지원은 Android 버전에 따라 다릅니다. Android 배포자는 Android 빌드에서 곡선을 추가하거나 제거하도록 선택할 수도 있습니다.
ECDH 네이티브 상호 운용성
.NET은 프로그램이 .NET에서 사용하는 OS 라이브러리와 상호 운용될 수 있도록 형식을 노출합니다. 관련된 형식은 플랫폼 간에 변환되지 않으며 필요한 경우에만 직접 사용해야 합니다.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
ECDiffieHellmanCng | ✔️ | ❌ | ❌ | ❌ | ❌ |
ECDiffieHellmanOpenSsl | ❌ | ✔️ | ⚠️* | ❌ | ❌ |
* macOS에서는 OpenSSL이 설치되어 있고 동적 라이브러리 로딩을 통해 적절한 libcrypto dylib를 찾을 수 있는 경우 ECDiffieHellmanOpenSsl이 작동합니다. 적절한 라이브러리를 찾을 수 없으면 예외가 throw됩니다.
DSA
DSA(디지털 서명 알고리즘) 키 생성은 시스템 라이브러리에 의해 수행되며 크기 제한 사항 및 성능 특성이 적용됩니다.
함수 | Windows CNG | Linux | macOS | Windows CAPI | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|---|
키 만들기(<= 1024비트) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ✔️ |
키 만들기(> 1024비트) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
키 로드(<= 1024비트) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
키 로드(> 1024비트) | ✔️ | ✔️ | ⚠️* | ❌ | ❌ | ✔️ |
FIPS 186-2 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
FIPS 186-3(SHA-2 서명) | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ |
* macOS는 1024비트보다 큰 DSA 키를 로드하지만 해당 키의 동작은 정의되지 않습니다. FIPS 186-3에 따라 동작하지 않습니다.
Windows의 DSA
- Windows CAPI(CryptoAPI)는
new DSACryptoServiceProvider()
가 사용될 때마다 사용됩니다. new DSACng()
가 사용될 때마다 Windows CNG(Cryptography API Next Generation)가 사용됩니다.- DSA.Create에서 반환된 개체는 Windows CNG에 의해 내부적으로 구동됩니다. 이러한 Windows CNG 사용은 구현 세부 사항이며 변경될 수 있습니다.
- X509Certificate2의 GetDSAPublicKey 확장 메서드는 DSACng 인스턴스를 반환합니다. DSACng의 사용은 구현 세부 정보이며 변경될 수 있습니다.
- X509Certificate2의 GetDSAPrivateKey 확장 메서드는 DSACng 인스턴스를 선호하지만 DSACng가 키를 열 수 없는 경우 DSACryptoServiceProvider가 시도됩니다. 기본 공급자는 구현 세부 사항이며 변경될 수 있습니다.
DSA 네이티브 상호 운용성
.NET은 프로그램이 .NET 암호화 코드에서 사용하는 OS 라이브러리와 상호 운용될 수 있도록 형식을 노출합니다. 관련된 형식은 플랫폼 간에 변환되지 않으며 필요한 경우에만 직접 사용해야 합니다.
Type | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
DSACryptoServiceProvider | ✔️ | ⚠️1 | ⚠️1 | ❌ | ⚠️1 |
DSACng | ✔️ | ❌ | ❌ | ❌ | ❌ |
DSAOpenSsl | ❌ | ✔️ | ⚠️2 | ❌ | ❌ |
1 Windows가 아닌 경우 기존 프로그램과의 호환성을 위해 DSACryptoServiceProvider를 사용할 수 있습니다. 이 경우 명명된 키 열기와 같이 시스템 상호 운용이 필요한 모든 메서드는 PlatformNotSupportedException을 throw합니다.
2 macOS에서는 OpenSSL이 설치되어 있고 동적 라이브러리 로딩을 통해 적절한 libcrypto dylib를 찾을 수 있는 경우 DSAOpenSsl이 작동합니다. 적절한 라이브러리를 찾을 수 없으면 예외가 throw됩니다.
X.509 인증서
.NET의 X.509 인증서 지원 대부분은 OS 라이브러리에서 제공됩니다. .NET의 X509Certificate2 또는 X509Certificate 인스턴스에 인증서를 로드하려면 기본 OS 라이브러리에서 인증서를 로드해야 합니다.
PKCS12/PFX 읽기
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
비어 있음 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
하나의 인증서, 프라이빗 키 없음 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
하나의 인증서, 프라이빗 키 포함 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
여러 인증서, 프라이빗 키 없음 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
여러 인증서, 하나의 프라이빗 키 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
여러 인증서, 여러 프라이빗 키 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
PKCS12/PFX 쓰기
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
비어 있음 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
하나의 인증서, 프라이빗 키 없음 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
하나의 인증서, 프라이빗 키 포함 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
여러 인증서, 프라이빗 키 없음 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
여러 인증서, 하나의 프라이빗 키 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
여러 인증서, 여러 프라이빗 키 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
임시 로딩 | ✔️ | ✔️ | ❌ | ✔️ | ✔️ |
macOS는 디스크에 써야 하는 키 집합 개체 없이 인증서 프라이빗 키를 로드할 수 없습니다. 키 집합은 PFX 로딩을 위해 자동으로 만들어지며 더 이상 사용하지 않으면 삭제됩니다. X509KeyStorageFlags.EphemeralKeySet 옵션은 프라이빗 키가 디스크에 기록되어서는 안 된다는 것을 의미하므로 macOS에서 해당 플래그를 어설션하면 PlatformNotSupportedException이 발생합니다.
PKCS7 인증서 컬렉션 쓰기
Windows와 Linux는 모두 DER로 인코딩된 PKCS7 blob을 내보냅니다. macOS는 길이가 무한정인 CER로 인코딩된 PKCS7 blob을 내보냅니다.
X509Store
Windows에서 X509Store 클래스는 Windows 인증서 저장소 API를 나타냅니다. 이러한 API는 .NET Framework에서와 마찬가지로 .NET Core 및 .NET 5에서도 동일하게 작동합니다.
Windows가 아닌 경우 X509Store 클래스는 시스템 신뢰 결정(읽기 전용), 사용자 신뢰 결정(읽기-쓰기) 및 사용자 키 스토리지(읽기-쓰기)를 프로젝션합니다.
다음 표에서는 각 플랫폼에서 지원되는 시나리오를 보여 줍니다. 지원되지 않는 시나리오(테이블의 ❌)의 경우 CryptographicException이 throw됩니다.
내 저장소
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Open CurrentUser\My (ReadOnly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Open CurrentUser\My (ReadWrite) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Open CurrentUser\My (ExistingOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Open LocalMachine\My | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
Linux에서는 처음 쓰기 시 저장소가 만들어지고 기본적으로 사용자 저장소가 존재하지 않으므로 ExistingOnly
를 사용하여 CurrentUser\My
를 여는 데 실패할 수 있습니다.
macOS에서 CurrentUser\My
저장소는 사용자의 기본 키 집합이며 기본적으로 login.keychain
입니다. LocalMachine\My
저장소는 System.keychain
입니다.
루트 저장소
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Open CurrentUser\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Open CurrentUser\Root (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Open CurrentUser\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️(읽기 전용인 경우) | ❌ | ✔️(읽기 전용인 경우) |
Open LocalMachine\Root (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
Open LocalMachine\Root (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Open LocalMachine\Root (ExistingOnly) | ✔️ | ⚠️ | ✔️(읽기 전용인 경우) | ❌ | ✔️(읽기 전용인 경우) |
Linux에서 LocalMachine\Root
저장소는 OpenSSL의 기본 경로에 있는 CA 번들을 해석한 것입니다.
macOS에서 CurrentUser\Root
저장소는 사용자 신뢰 도메인에 대한 SecTrustSettings
결과를 해석한 것입니다. LocalMachine\Root
저장소는 관리 및 시스템 신뢰 도메인에 대한 SecTrustSettings
결과를 해석한 것입니다.
중간 저장소
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Open CurrentUser\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Open CurrentUser\Intermediate (ReadWrite) | ✔️ | ✔️ | ❌ | ❌ | ❌ |
Open CurrentUser\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️(읽기 전용인 경우) | ❌ | ❌ |
Open LocalMachine\Intermediate (ReadOnly) | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Open LocalMachine\Intermediate (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Open LocalMachine\Intermediate (ExistingOnly) | ✔️ | ⚠️ | ✔️(읽기 전용인 경우) | ❌ | ❌ |
Linux에서는 성공적인 X509Chain 빌드에 대한 기관 정보 액세스 레코드를 통해 중간 CA를 다운로드할 때 CurrentUser\Intermediate
저장소가 캐시로 사용됩니다. LocalMachine\Intermediate
저장소는 OpenSSL의 기본 경로에 있는 CA 번들을 해석한 것입니다.
macOS에서는 CurrentUser\Intermediate
저장소가 사용자 지정 저장소로 처리됩니다. 이 저장소에 추가된 인증서는 X.509 체인 빌드에 영향을 주지 않습니다.
허용되지 않는 저장소
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Open CurrentUser\Disallowed (ReadOnly) | ✔️ | ⚠️ | ✔️ | ✔️ | ✔️ |
Open CurrentUser\Disallowed (ReadWrite) | ✔️ | ⚠️ | ❌ | ❌ | ❌ |
Open CurrentUser\Disallowed (ExistingOnly) | ✔️ | ⚠️ | ✔️(읽기 전용인 경우) | ✔️(읽기 전용인 경우) | ✔️(읽기 전용인 경우) |
Open LocalMachine\Disallowed (ReadOnly) | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
Open LocalMachine\Disallowed (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
Open LocalMachine\Disallowed (ExistingOnly) | ✔️ | ❌ | ✔️(읽기 전용인 경우) | ✔️(읽기 전용인 경우) | ✔️(읽기 전용인 경우) |
Linux에서는 Disallowed
저장소가 체인 빌드에 사용되지 않으며 여기에 콘텐츠를 추가하려고 하면 CryptographicException이 발생합니다. 이미 콘텐츠를 획득한 경우 Disallowed
저장소를 열 때 CryptographicException이 throw됩니다.
macOS에서 CurrentUser\Disallowed 및 LocalMachine\Disallowed 저장소는 신뢰가 Always Deny
로 설정된 인증서에 대한 적절한 SecTrustSettings 결과를 해석한 것입니다.
존재하지 않는 저장소
시나리오 | Windows | Linux | macOS | iOS, tvOS, MacCatalyst | Android |
---|---|---|---|---|---|
Open non-existent store (ExistingOnly) | ❌ | ❌ | ❌ | ❌ | ❌ |
Open CurrentUser non-existent store (ReadWrite) | ✔️ | ✔️ | ⚠️ | ❌ | ❌ |
Open LocalMachine non-existent store (ReadWrite) | ✔️ | ❌ | ❌ | ❌ | ❌ |
macOS에서는 X509Store API를 사용한 사용자 지정 저장소 만들기가 CurrentUser
위치에 대해서만 지원됩니다. 사용자의 키 집합 디렉터리(~/Library/Keychains)에 암호가 없는 새 키 집합이 만들어집니다. 암호로 키 집합을 만들려면 SecKeychainCreate
에 대한 P/Invoke를 사용할 수 있습니다. 마찬가지로, SecKeychainOpen
을 사용하여 다른 위치에서 키 집합을 열 수 있습니다. 결과 IntPtr
을 new X509Store(IntPtr)
에 전달하여 현재 사용자의 권한에 따라 읽기/쓰기 가능 저장소를 가져올 수 있습니다.
X509Chain
macOS는 오프라인 CRL 활용을 지원하지 않으므로 X509RevocationMode.Offline
은 X509RevocationMode.Online
으로 처리됩니다.
macOS는 CRL(인증서 해지 목록)/OCSP(온라인 인증서 상태 프로토콜)/AIA(인증 기관 정보 액세스) 다운로드 시 사용자 시작 시간 제한을 지원하지 않으므로 X509ChainPolicy.UrlRetrievalTimeout
이 무시됩니다.
추가 리소스
.NET