이 글은 FIDO에 대한 설명이 아닌, FIDO 인증을 받기 위한 일련의 과정을 서술한 내용입니다.
FIDO가 무엇인가에 대해서는 아래의 url을 참고해주시면 감사하겠습니다
https://dc-choi.tistory.com/64
https://dc-choi.tistory.com/65
FIDO Certification Process
현 회사에서는 FIDO2 Server 인증을 받기위해 다음과 같은 과정을 거쳤습니다.
엔지니어로써 신경을 써야하는 부분은 크게 두가지이며, 그것은 다음과 같습니다.
1. Conformance Self‐Validation Testing
2. Interoperability Testing
이 글에서는 위의 두가지에 대해서 서술하도록 하겠습니다.
Conformance Self‐Validation Testing
https://fidoalliance.org/certification/functional-certification/conformance/
먼저 Conformance Self‐Validation Testing이란 직역하면 '적합성 자체 검증 테스트'라고 합니다.
이 Conformance Self‐Validation Testing에 통과하기 위해서는 테스트 툴 사용을 등록해야합니다.
그리고 그 테스트툴의 테스트 케이스에 대해서 전부 통과해야합니다.
테스트 툴 사용을 등록후 승인을 받고 프로그램을 실행하면 다음과 같이 나오게 됩니다.
인증을 진행하고자하는 부분을 클릭하시면 다음 화면으로 넘어가게 됩니다. 저는 FIDO2 Server 인증을 받기위해서 Server 부분을 진행하였습니다. Server 부분의 항목은 다음과 같습니다.
Server 인증을 받기 위해서는 Select Test to Run 부분의 항목을 전부 클릭해야합니다. 그래야 FIDO Alliance측에서 요구하는 테스트 조건을 통과하게 됩니다. Test Configuration은 서버 Url을 입력해야 합니다. FIDO에서 요구하는 필수 알고리즘을 제외한 알고리즘을 선택할 수 있는 부분이 있습니다. OPTIONAL한 알고리즘을 선택하도록 합니다.
마지막으로 메타데이터를 다운로드 받아야 합니다. 메타데이터 다운로드에 대해서는 Download Test Metadata를 통해서 JSON 파일을 받아야 합니다. 자세한 내용은 예제 코드를 통해서 설명드리도록 하겠습니다.
const statements: MetadataStatement[] = [];
// Load in statements from JSON files
try {
const mdsMetadataPath = './metadata-statements';
const mdsMetadataFilenames = fs.readdirSync(mdsMetadataPath);
for (const statementPath of mdsMetadataFilenames) {
if (statementPath.endsWith('.json')) {
const contents = fs.readFileSync(`${mdsMetadataPath}/${statementPath}`, 'utf-8');
statements.push(JSON.parse(contents));
}
}
} catch (err) {
console.log('is error');
}
// Set above root cert for use by MetadataService
SettingsService.setRootCertificates({ identifier: 'mds', certificates: [
END_ROOT,
MDS3ROOT,
] });
// Reset preset root certificates
SettingsService.setRootCertificates({ identifier: 'apple', certificates: [] });
await fetch('https://mds3.certinfra.fidoalliance.org/getEndpoints', {
method: 'POST',
body: JSON.stringify({ endpoint: `${env.app.web.url}` }),
headers: { 'Content-Type': 'application/json' },
})
.then(resp => resp.json())
.then(json => {
const mdsServers: string[] = json.result;
mdsServers.push('https://mds.fidoalliance.org/');
return MetadataService.initialize({
statements,
mdsServers,
verificationMode: 'strict',
});
})
.catch(console.error)
.finally(() => {
console.log('🔐 MetadataService initialized');
});
다음 코드는 SimpleWebAuthn 라이브러리를 사용하여, TS로 구현을 해놓은 예제입니다.
https://github.com/MasterKale/SimpleWebAuthn
Download Test Metadata를 통해서 받은 JSON 파일을 저장하고 각 루트인증서를 가져와서, 루트인증서를 적용후, 엔드포인트를 가져와서 메타데이터를 읽어오면 됩니다. 메타데이터에 대한 자세한 설명은 다음 url을 참고해주세요.
https://fidoalliance.org/specs/mds/fido-metadata-statement-v3.0-ps-20210518.html
https://fidoalliance.org/specs/mds/fido-metadata-service-v3.0-ps-20210518.html
저도 SimpleWebAuthn 라이브러리를 사용하여 FIDO2 Server 인증을 받았고, 해당 옵션을 선택한 다음 테스트를 진행하였습니다. 테스트 결과는 다음과 같습니다.
총 172개의 테스트 케이스를 통과했고, 다음의 사진처럼 서버의 결과를 제출하라는 버튼이 나오게 됩니다.
제출을 완료하면 Conformance Self‐Validation Testing을 전부 통과하게 됩니다. Interoperability Testing의 일정 14일 전에 마쳐야 합니다. 자세한 내용은 아래 url을 참고해주세요.
Interoperability Testing
https://fidoalliance.org/certification/interoperability-testing/
FIDO Alliance측에서 요구하는 날짜에 맞춰서 진행해야 합니다. 상단의 url에 날짜에 대한 공지가 나옵니다. Interop Test에 등록을 해야하는데, 등록을 하기 전, 비밀유지 서약서를 작성해야 합니다. 저 또한 비밀서약서에 의해 Interop Test의 세부 내용을 자세히 서술할 수 없다는 점 양해 부탁드립니다. 자세한 내용 또한 상단의 url에 나오니 참고바랍니다.
Interop Test에 들어가기 위해서는 해당 html을 사용해야 합니다.
https://github.com/fido-alliance/fido2-interop-webapp
FIDO Alliance측에서 공식적으로 사용하는 html파일입니다. 이 소스코드의 수정을 절대 금지한다고 합니다.
저는 해당 날짜에 Interop Test를 진행하였습니다.
약 4일간 테스트를 진행하였고, 해당 시간에 맞춰서 일을 진행하였습니다. 그 결과... 테스트에 통과하였습니다.
Interop Test에 등록을 성공하게되면 인증에 성공했다는 등록 요청을 진행해야합니다.
느낀점
1. Conformance Self‐Validation Testing을 진행하면서 우리는 SimpleWebAuthn이라는 라이브러리를 사용했었기에 이 라이브러리가 문제가 발생할 경우, 인증을 진행할 수 없는 상황이였습니다. 하지만 우리는 이슈를 남겼었고, 결국 오픈소스에 기여하는 경험을 쌓으면서 Conformance Self‐Validation Testing을 통과하였습니다.
다음 url은 팀원들이 서로 블로그에 후기를 남긴 내용입니다.
https://velog.io/@seungju0000/my-first-open-source-pr
https://dc-choi.tistory.com/69
2. Interop Test를 진행하면서 Conformance Self‐Validation Testing에서 몰랐던 X509에 대해서 더욱 자세하게 알게 되었습니다. 다른 인증자측에서 루트인증서를 V1으로 발급할 경우 호환이 되지않는 오류가 발생했었습니다. X509는 V1과 V3가 있습니다. V1는 너무 옛날 스펙이기에 더 이상 사용을 권하지 않는다고 합니다.
https://gruuuuu.github.io/security/what-is-x509/
3. FIDO2 Server 인증을 무사히 마칠 수 있어서 다행입니다. 여러 국적의 사람들과 커뮤니케이션할 수 있었고, 그를 통해 모르던 사실을 알고 공부하게 되었습니다. 비록 인증을 받으면서는 밤낮도 바꿔가면서 일했지만, 이번 경험을 통해 더욱 더 개발자로서 성장할 수 있는 기회를 잡았던거 같습니다.
다시 한번 팀원들에게 감사하다는 인사를 전하며, 이것으로 긴 글을 마치도록 하겠습니다. 감사합니다.
'개발 > FIDO' 카테고리의 다른 글
[FIDO] FIDO2 (0) | 2022.06.15 |
---|---|
[FIDO] FIDO(Fast IDentity Online)란? (0) | 2022.06.15 |