SAF
z/OS® 용 Java™ SAF (System Authorization Facility) 인터페이스는 추가 보안 API 세트를 제공합니다. SAF의 디지털 인증서 지원 및 Resource Access Control Facility(Resource Access Control Facility) 와 같은 외부 보안 관리자의 구현은 데이터 세트 또는 파일에 인증서 및 키를 저장하는 대신 애플리케이션을 제공합니다.
SAF 보안 API는 Java 애플리케이션에서 주체 기반 접근 제어를 구현하기 위한 API에 z/OS UNIX 대한 접근을 제공합니다. 예를 들어, Java SecurityManager 클래스를 구현하는 애플리케이션에서. 이러한 API는 서비스를 z/OS UNIX 감싸는 Java 클래스를 통해 구현됩니다. 해당 z/OS UNIX 서비스는 차례로 보안 서버에 의해 처리되며, z/OS 해당 서버는 SAF 인터페이스(예: RACF )를 구현합니다. 이러한 API를 사용하는 애플리케이션은 APF (Authorized Program Facility) 에서 권한을 부여하지 않아도 됩니다.
SDK의 JCECCARACFKS및 JCERACFKS키 저장소는 SAF 디지털 인증서 지원을 제공하여 IBMJCECCA및 IBMZSecurity 제공자가 SAF에서 키 및 인증서를 저장하고 검색할 수 있도록 합니다.
키스토어에 대한 자세한 내용은 ‘ Oracle ’ 문서의 ‘키 관리’ 섹션을 참조하십시오.
디지털 인증서 지원은 두 개의 키 저장소 유형 (JCERACFKS및 JCECCARACFKS) 으로 구현됩니다. RACFInputStream라는 InputStream 클래스, RACFOutputStream라는 OutputStream 클래스 및 URLStreamHandler 클래스도 구현됩니다. 해당 URLStreamHandler 클래스는 또는 RACFOutputStreamRACFInputStream 인스턴스를 를 사용하여 접근할 URL 수 있게 합니다. URLStreamHandler 객체는 IBMZSecurity zseckeytool 프로그램과 IBMJCECCA 키 도구 프로그램(hwkeytool) 모두에서 사용할 수 z/OS 있습니다. 자세한 내용은 hwkeytool hwkeytool 키 및 인증서 관리 유틸리티를 참조하십시오. 자세한 내용은 zseckeytool IBMZSecurity를 참조하십시오. URLStreamHandler자세한 내용은 Oracle URLStreamHandler 을 참조하십시오.
RACF 의 키스토어 클래스인 IBMZSecurity 공급자용 JceRACFKeyStore (이하 JCERACFKS)와 IBMJCECCA 공급자용 JceRACFKeyStore (이하 JCECCARACFKS)는 SAF가 지원되는 z/OS 운영 체제에서만 사용할 수 있습니다.
키 저장소 클래스 JceRACFKeyStore는 IBMZSecurity및 IBMJCECCA 제공자 모두에서 구현됩니다. 이 클래스는 RACF 키 링에서 인증서 및 키를 저장하고 검색하는 데 사용할 수 있습니다. RACFInputStream 및 RACFOutputStream 클래스는 JceRACFKeyStore 클래스와 함께 사용하기 위한 것입니다. 다른 키 저장소와 함께 RACFInputStream 또는 RACFOutputStream 클래스를 사용하면 예기치 않은 결과가 발생할 수 있습니다.
JceRACFKeyStore, RACFInputStream및 RACFOutputStream 클래스를 포함한 모든 Java RACF 서비스는 R_datalib (IRRSDL00) 서비스를 사용하여 RACF에서 인증서를 검색하고 저장합니다. 이 서비스를 사용하려면 원하는 설정에 따라 사용자에게 특정 권한을 부여해야 합니다. Java RACF 클래스를 사용하기 전에 R_datalib에 대해 올바른 권한을 설정해야 합니다. 필요한 권한 설정 방법에 대한 자세한 내용은 사용 중인 버전의 ‘ z/OS ’에 대한 ‘ z/OS Security Server RACF Callable Services’를 참조하십시오.
- 새로 작성된 인스턴스를 JceRACFKeyStore에 직접 전달하여 RACFInputStream 또는 RACFOutputStream 클래스를 사용하십시오.
- URLStreamHandler 클래스를 사용하여 RACFInputStream 또는 RACFOutputStream 클래스를 간접적으로 호출한 후 인스턴스를 JceRACFKeyStore에 전달하십시오.
JCECCARACFKS및 JCERACFKS키 저장소는 대소문자 혼합 레이블 및 별명 이름을 지원하는 키 링에서 인증서를 저장하고 검색할 수 있습니다. 키 링에 첨부된 다른 별명 또는 레이블 이름과 최소한 1자이상 다른 별명 또는 레이블 이름을 사용하십시오. 대소문자만 다른 문자 별명 또는 레이블 이름을 사용하지 마십시오. 이러한 이름으로 인해 JCECCARACFKS 또는 JCERACFKS키 저장소에서 정보를 저장하거나 검색할 때 검색 불일치가 발생할 수 있습니다.
RACF 에서 RACF 키 링 설정
키링을 설정할 때 "PERSONAL" 인증서로 연결된 모든 인증서는 객체로 KeyEntry 간주되며, 따라서 개인 키가 사용 가능하므로 최종 사용자 인증서(예: SSL 핸드셰이크)로 사용할 수 있습니다. "CERTAUTH" 인증서로 연결된 모든 인증서는 인증 TrustedCertEntry 객체로 간주되며, 예를 들어 SSL 인증 과정에서 인증 기관(CA) 인증서로 사용할 수 있습니다. 자체 서명되지 않은 인증서가 있고 "PERSONAL" 인증서로 연결된 키 링에는 "CERTAUTH" 로 연결된 "PERSONAL" 인증서의 CA 인증서도 있어야 합니다. 자체 서명 인증서에는 "CERTAUTH" 인증서가 필요하지 않습니다. "SITE" 인증서로 연결된 인증서는 현재 지원되지 않습니다. 다음 예제는 JSSE 클라이언트와 서버가 신뢰 및 키 정보 모두에 사용할 수 있는 RACF 키링의 설정을 보여줍니다.
Certificate Label Name Cert Owner USAGE DEFAULT
---------------------- ---------- -------- -------
PersonalEndUserCert ID(USERID) PERSONAL YES
PersonalEndUserCACert CERTAUTH CERTAUTH NO
RACFInputStream 인스턴스를 사용하여 RACF 키 링을 Java RACF 키 저장소에 로드
RACFInputStream 인스턴스를 작성하려면 다음 매개변수가 필요합니다.
userID: 키 링을 소유하는 사용자의 ID를 포함하는 문자열입니다.ringid: RACF 키 링의 이름을 포함하는 문자열password: 키 저장소의 비밀번호를 포함하는 문자 배열입니다.
다음 예제는 RACFInputSteam 인스턴스를 직접 사용하여 사용자 ID, 링 ID및 null 비밀번호를 전달하는 방법을 보여줍니다.
import com.ibm.crypto.zsecurity.provider.RACFInputStream;
String ksfname;
char[] storePass = null;
RACFInputStream riStream = new RACFInputStream(System.getProperty("user.name"),
ksfname,
storePass);
KeyStore racfKeyStore = KeyStore.getInstance("JCERACFKS");
racfKeyStore.load(riStream, storePass);
riStream.close();
이전 코드 예제에서 user.name 시스템 특성은 RACF에 전달할 사용자 ID를 얻는 데 사용됩니다. 실제 애플리케이션에서는 이 단계가 수행되지 않을 수 있습니다.
RACFOutputStream 인스턴스를 사용하여 Java RACF 키 저장소를 RACF 키 링에 저장
RACFOutputStream 인스턴스를 작성하려면 다음 매개변수가 필요합니다.
userID: 키 링을 소유하는 사용자의 ID를 포함하는 문자열입니다.ringid: RACF 키 링의 이름을 포함하는 문자열password: 키 저장소의 비밀번호를 포함하는 문자 배열입니다.
다음 예제는 RACFOutputStream 인스턴스를 직접 사용하여 사용자 ID, 링 ID및 null 비밀번호를 전달하는 방법을 보여줍니다.
import com.ibm.crypto.zsecurity.provider.RACFOutputStream;
String ksfname;
char[] storePass = null;
RACFOutputStream roStream = new RACFOutputStream(System.getProperty("user.name"),
ksfname,
storePass);
KeyStore racfKeyStore = KeyStore.getInstance("JCERACFKS");
racfKeyStore.store(roStream, storePass);
roStream.close();
이전 코드 예제에서 user.name 시스템 특성은 RACF에 전달할 사용자 ID를 얻는 데 사용됩니다. 실제 애플리케이션에서는 이 단계가 수행되지 않을 수 있습니다.
RACFKeyStore 클래스를 사용하여 RACF 에 키 저장
RACFKeyStore 를 사용하여 기존 RACF 키 링을 갱신하거나 새 RACF 키 링을 작성할 수 있습니다. RACFOutputStream 인스턴스에 대한 사용자 ID및 링 이름으로 지정된 RACF 키 링이 존재하지 않으면 키 링이 작성됩니다. RACF 키 링이 있으면 갱신됩니다. 어느 경우에나 저장 메소드가 호출될 때 키 저장소의 모든 인증서 및 키가 RACF 키 링에 추가됩니다. 기존 RACF 키 링을 갱신할 때, 저장 메소드가 호출될 때 삭제되는 기존 RACF 인증서 및 키가 RACF 키 링에서 제거됩니다.
RACF 키 저장소에서 삭제된 항목은 RACF 키 링에서 제거되지만 RACF 인증서 프로파일은 RACF에서 삭제되지 않습니다. RACF에 존재하지만 레이블 또는 별명이 다른 인증서가 추가되는 경우, 인증서가 기존 레이블과 함께 RACF 키 링에 추가되고 IOException 인스턴스가 리턴되어 다른 레이블 또는 별명과 함께 인증서가 존재함을 표시합니다.
RACF 키 링을 갱신하는 중에 오류가 발견되면 항목의 모든 추가 또는 삭제가 처리되지만 첫 번째 오류만 예외로 보고됩니다.
- 기존 입력 RACF 키 링을 지정하기 위해
RACFInputStream인스턴스가 작성됩니다. RACFInputStream인스턴스는RACFKeyStore.load()메소드를 사용하여RACFKeyStore인스턴스에 로드됩니다.- 입력 링에는 이름이
Key01인 1개의 키 항목과 이름이Cert01인 1개의 신뢰할 수 있는 인증서 항목이 포함되어 있습니다. Key01는RACFKeyStore.delete()메소드를 사용하여 삭제됩니다.Key02및Key03라는 두 개의 새 키 항목이RACFKeyStore.setKeyEntry()메소드를 사용하여RACFKeyStore인스턴스에 추가됩니다.- 출력 RACF 키 링을 지정하기 위해
RACFOutputStream인스턴스가 작성됩니다. - 업데이트는
RACFKeyStore.Store()메소드를 사용하여RACFOutputStream인스턴스에 지정된 RACF 키 링에 기록됩니다.- 먼저, 출력 RACF 키 링에서
Key01를 제거하여 삭제 항목을 처리합니다. - 다음으로 RACFKeyStore 인스턴스의 모든 항목이 출력 RACF 키 링에 추가됩니다.
- 이 예제에서
Key02를 출력 RACF 키 링에 추가하려고 시도하는 중에 오류가 발생했습니다. Cert01가 출력 RACF 키 링에 추가되었습니다.- 출력 RACF 키 링에
Key03를 추가하는 중에 오류가 발생했습니다.
- 먼저, 출력 RACF 키 링에서
Key02을 (를) 추가하는 중에 발생한 오류의 세부사항과 함께 예외가 발생했습니다.
URLStreamHandler 클래스를 사용하여 RACFInputStream 및 RACFOutputStream 인스턴스에 액세스
사용자 정의 클래스를 사용하여 데이터에 액세스하려면 URLStreamHandler 클래스가 필요합니다. 특정 URL및 연관된 클래스를 사용하여 SAF (RACF) 키 링에 저장된 데이터에 액세스할 수 있습니다.
safkeyring이것을 사용할 때는 반드시 시스템 URL
java.protocol.handler.pkgs속성도 지정해야 합니다. 이 특성을 사용하면 URLStreamHandler 클래스가 RACFInputStream 오브젝트를 작성할 수 있습니다. SAF( RACF ) 키 링에 저장된 데이터에 접근하는 및 관련safkeyringURL 클래스들입니다.시스템 특성의 값은 암호화 지원에 사용 중인 제공자입니다. 예를 들어, IBMJCECCA 제공자를 사용하는 경우 다음 예제에 표시된 대로 시스템 특성을 설정하십시오.
java.protocol.handler.pkgs=com.ibm.crypto.hdwrCCA.providerjava.lang.System.setProperty 메소드를 사용하여 Java 애플리케이션에서 이 특성을 설정할 수도 있습니다.System.setProperty("java.protocol.handler.pkgs", "com.ibm.crypto.hdwrCCA.provider");사용하지만 시스템java.protocol.handler.pkgs속성을safkeyringURL 설정하지 않으면 다음 오류가 발생합니다:java.net.MalformedURLException: unknown protocol: safkeyring다음 구문을 사용하여 키 링 및 사용자 ID를 지정하십시오."safkeyring://userid/keyring"safkeyringjce|safkeyringjcehybrid|safkeyringjcecca이러한 URL에 대한 지원은 버전 11에서 추가되었지만 더 이상 사용되지 않으며 향후 릴리스에서 제거될 수 있습니다.
다음 표에 표시된 대로, 액세스하려는 키스토어 유형에 해당하는 RACF 키스토어 유형을 URL 사용하십시오.java.protocol.handler.pkgs시스템 특성을 지정할 필요가 없습니다.표 1. 다른 키 저장소 유형에 대한 SAF키 링 URL 키 저장소 유형 URL JCECCARACFKSsafkeyringjceccaJCERACFKSsafkeyringjceJCEHYBRIDRACFKSsafkeyringjcehybrid다음 구문을 사용하여 JCECCARACFKS 유형의 키 저장소에 대한 키 링 및 사용자 ID를 지정하십시오."safkeyringjcecca://userid/keyring"보안 관리자가 사용 가능한 상태에서 이러한 URL을 사용하는 애플리케이션을 실행하면 순환 로드 오류가 발생합니다. 자세한 정보는 알려진 기능 및 제한사항을 참조하십시오.
RACF 키 저장소에 저장하기 위해 지원되는 키 유형
JCERACFKS RACF 키 저장소는 다음 Java키 유형을 지원합니다.
RSAPrivateKey: 소프트웨어 RSA 형식RSAPrivateCrtKey: 소프트웨어 RSA (CRT) 형식ECPrivateKey: 소프트웨어 EC 형식
JCECCARACFKS RACF 키 저장소는 다음 Java키 유형을 지원합니다.
RSAPrivateKey: 소프트웨어 RSA키 형식이 키 유형은 RSAPrivateHWKey 형식으로 변환됩니다.
RSAPrivateCrtKey: 소프트웨어 RSA (CRT) 형식이 키 유형은 RSAPrivateHWKey 형식으로 변환됩니다.
RSAPrivateHWKey: 외부 ICSF 토큰이 있는 CLEAR RSA 형식RSAPrivateHWKey: PKDS RSA 형식ECPrivateKey: 소프트웨어 EC키 형식이 키 유형은 ECPrivateHWKey 형식으로 변환됩니다.
ECPrivateHWKey: 외부 ICSF 토큰이 있는 CLEAR EC 형식ECPrivateHWKey: PKDS EC 형식
다른 키 형식은 지원되지 않습니다.
비밀번호 및 RACF 키 저장소
파일 기반 키 저장소에서 비밀번호 매개변수는 다음과 같은 세 가지 기본 이유로 사용됩니다.
- 키 저장소 파일의 무결성을 보호하기 위해
- 키 저장소에서 사용되는 동안 Java 메모리의 키를 보호하기 위해
- 파일 기반 키 저장소에서 저장 시 키를 보호하기 위해
비밀번호 매개변수는 RACF 키 저장소에서 다르게 사용됩니다. RACF 키 저장소의 키는 파일이 아닌 RACF 데이터베이스에 저장되므로 키 저장소가 Java 메모리에 있는 동안 키를 보호하기 위해서만 비밀번호가 사용됩니다. RACF 키 링의 디지털 인증서 및 키는 RACF 프로파일에 의해 보호됩니다.
| 방법 | 암호 매개변수 사용 |
|---|---|
RACFInputStream.RACFInputStream() |
Java 메모리의 RACF 에서 로드되는 키를 보호하기 위해 |
JceRACFKeyStore.load() |
입력 RACFInputStream 인스턴스가 동일한 비밀번호로 구성되었는지 유효성 검증하려면 다음을 수행하십시오. |
JceRACFKeyStore.setKeyEntry() |
입력 키를 보호하기 위해 |
JceRACFKeyStore.getKeyEntry() |
보호 키 복구 |
JceRACFKeyStore.store() |
입력 RACFOutputStream 인스턴스가 동일한 비밀번호로 구성되었는지 유효성 검증하려면 다음을 수행하십시오. |
RACFOutputStream.RACFOutputStream() |
보호된 키를 RACF 키 링에 저장하기 전에 Java 메모리에서 복구 |
키 저장소 비밀번호와 함께 Java API를 사용하면 애플리케이션이 비밀번호를 지정하여 개별 키 저장소 항목을 보호할 수 있습니다. JceRACFKeyStore, RACFInputStream 및 RACFOutputStream 를 사용하여 키를 검색하고 설정하는 인스턴스 내에서 동일한 비밀번호를 사용해야 합니다. 모든 비밀번호가 기본값을 사용하도록 허용하는 것이 좋습니다.
비밀번호 매개변수의 기본값은 null를 전달하여 모든 메소드에서 password 로 설정됩니다.
JCECCARACFKS KeyStore 인스턴스 업데이트
KeyStore 인스턴스는 고유 레이블 또는 별명 이름으로 참조되는 키 및 인증서의 콜렉션을 포함하는 Java 오브젝트입니다. 대부분의 Java키 저장소의 경우 지속적 데이터는 파일에 저장됩니다. 그러나 JCECCARACFKS키 저장소에 대한 지속적 데이터는 RACF 데이터베이스에 저장되고 RACF 키 링에 연결됩니다. RACF 데이터베이스 및 키 링의 특성으로 인해 업데이트 조작 중 JCECCARACFKS키 저장소의 동작은 파일 기반 키 저장소의 동작과 다릅니다.
다음 논의에서 ‘애플리케이션’은
사용자 KeyStore 애플리케이션을 의미할 수도 있고 유틸리티를 hwkeytool 의미할 수도 있습니다.
- 키 저장소 로드 및 업데이트 조작
키 저장소의 컨텐츠에 액세스하기 위해 애플리케이션은 load() 메소드를 사용하여 키 저장소에서 지속적 데이터를 검색하고 KeyStore 오브젝트를 작성합니다. 이 오브젝트는 애플리케이션에서 조회하고 업데이트할 수 있습니다. KeyStore 갱신 메소드에는 deleteEntry(), setEntry(), setCertificateEntry()및 setKeyEntry()가 포함됩니다. RACF 키 저장소에 지원되는 hwkeytool 업데이트 명령에는 -delete, -genkeypair, -importcert및 -importkeystore가 포함됩니다.
애플리케이션이 키 저장소의 지속적 데이터를 수정하려는 경우 store() 메소드를 사용합니다. store() 메소드의 동작은 지속적 데이터의 기본 스토리지에 따라 다릅니다.
- 파일 기반 키 저장소 및 KeyStore store() 메소드
파일 기반 키 저장소의 업데이트 모델은 대체 모델입니다. 애플리케이션이 파일 기반 키 저장소에 대해 store() 메소드를 사용하는 경우, 애플리케이션 메모리에 있는 KeyStore 오브젝트의 컨텐츠가 키 저장소의 현재 지속적 데이터를 대체합니다. 즉, 성공적인 KeyStore 업데이트는 키 저장소에 대한 지속적 데이터의 새 버전에 반영됩니다.
두 애플리케이션이 동시에 동일한 키 저장소를 업데이트하는 경우 대체 모델의 한 가지 결과가 발생합니다. 이를 설명하기 위해 애플리케이션
app1및 애플리케이션app2이 다음 순서로 동일한 키 저장소를 수정한다고 가정하십시오.app1는 키 저장소를 KeyStore 오브젝트에 로드하고 일부 업데이트를 작성합니다.app2는 키 저장소를 KeyStore 오브젝트에 로드하고 일부 업데이트를 작성합니다.app1는 KeyStore 오브젝트의 컨텐츠를 지속적 키 저장소 데이터에 저장합니다.app2는 KeyStore 오브젝트의 컨텐츠를 지속적 키 저장소 데이터에 저장합니다.
이 시나리오에서는
app2가 키 저장소를 로드하기 전에app1변경사항이 지속적 데이터에 저장되지 않았고app2가app1이후에 지속적 데이터를 대체했기 때문에app1에 의해 작성된 업데이트가app2에 의해 겹쳐써집니다.- RACF 키 저장소 및 KeyStore store() 메소드
JCECCARACFKS키 저장소의 업데이트 모델은 업데이트 모델입니다. 이는 이전에 설명된 효과를 방지하기 위해 이러한 방식으로 구현되었습니다. 기존 KeyStore 항목을 변경하면 기존 버전의 항목이 키 링에서 연결이 끊어지고 새 항목의 데이터가 RACF 데이터베이스에 추가된 후 새 항목이 키 링에 연결됩니다. 업데이트가 deleteEntry() 또는
hwkeytool -delete에 관계없이 삭제 조작인 경우에도 데이터는 RACF 데이터베이스에서 제거되지 않으며 KeyStore 오브젝트로 표시되는 키 링에서만 연결이 끊어집니다. RACF 데이터베이스에서 데이터를 삭제하려면 RACF 유틸리티 RACDCERT를 사용해야 합니다.다음 RACF 데이터베이스 및 키 링 갱신은 허용되지 않습니다.
- 만료된 인증서가 있는 항목은 업데이트할 수 없습니다.
- 만기된 인증서를 사용하여 항목을 업데이트할 수 없습니다.
- 인증서 항목을 키 항목으로 대체할 수 없습니다.
- 키 항목을 인증서 항목으로 대체할 수 없습니다.
- 새 버전의 공개 키가 기존 버전의 공개 키와 일치하지 않으면 항목을 업데이트할 수 없습니다.
- 단일 인증서를 여러 키 링에 연결할 수 있지만 RACF 데이터베이스에는 하나의 사본만 있을 수 있으며 하나의 레이블만 사용하여 저장됩니다.
IBMJCECCA 보안 제공자가 RACF에서 허용하지 않는 업데이트를 발견하면 KeyStore 항목 업데이트를 시도할 때 예외가 발생합니다. IBMJCECCA 보안 제공자가 RACF 데이터베이스 업데이트가 실패할 것으로 예측할 수 없는 경우도 있습니다. 이로 인해 KeyStore 업데이트가 성공할 수 있지만 store() 조작 중에 오류 또는 경고가 보고됩니다.
이 동작의 일부 가능한 영향은 다음과 같습니다.
- 항목의 이전 버전은 키 링에서 연결이 끊어지고 새 버전은 키 링에 연결되지 않습니다.
- KeyStore 업데이트에 지정된 레이블 이외의 레이블을 사용하여 인증서를 키 링에 연결할 수 있습니다.
키 저장소에 의도하지 않고 원하지 않는 변경사항이 있는 경우 RACF 유틸리티 RACDCERT를 사용하여 키 링 항목을 다시 연결하거나 업데이트해야 할 수 있습니다.
추가 정보:
SAF API 참조 문서는 보안 API 참조의 SAF (Sytem Authorization Facility) 를 참조하십시오.
RACF 의 External Security Manager에 정보를 입력하거나 업데이트하는 방법에 대한 자세한 내용은 사용 중인 z/OS 버전의 설명서를 RACDCERT 참조하십시오. RACF에 대해서도 다음 문서를 사용할 수 있습니다.
- z/OS Security Server RACF 보안 관리자 가이드
- z/OS Security Server RACF 명령어 참조
- z/OS Security Server RACF 호출 가능 서비스