Json File , genellikle sunucu ve istemci arasında veri aktarmında kullanılan dosya tipidir. Veri dönüştürmek için kullanılır. Dosya uzantısı .json şeklindedir.
Json file içeresinde şu tür veri tipleri olabilir;
- String
- Number
- Array
- Object
- Boolean
- Null
Örnek bir json file dosyasında üzerine adım adım inceleme yapalım. Bir SSL scan aracı üzerinden aldığım ekran çıktısını adım adım inceleyecek olursak; nesneleri(object) ve dizinleri(array) yapılarını görebilir.
Json yapısı her zaman { ile başlar ve } her zaman parantezi ile biter. Oluşturulan her nesneden yada diziden sonra virgül koyulmalıdır. Json yapısı isim:değer çiftlerinden oluşur.
Aşağıda ki ekran çıktısı üzerinden bazı nesnelere bakalım.
“host”: “asimmisirli.com”,Burada host ismi asimmisirli.com değeri temsil etmektedir.. Yani siz asimmisirli.com değerini almak için host ismini kullanacaksınız. Yada diyelim ki siz ip adresini okuyup işlem yapmak istiyorsunuz. Bunun isim:değer çiftlerinden ip ismini alarak ip değerine ulaşabilirsiniz.
"host": "asimmisirli.com",
"ip": "93.187.201.200",
"port": 443,
"elapsedTime": 2331,
"tlsVersion": "TLSv1.2",
"cipher": "ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD",
"tempPublicKeyAlg": "ECDH prime256v1",
"tempPublicKeySize": 256,
"secureRenego": true,
"compression": "NONE",
"expansion": "NONE",
"sessionLifetimeHint": 7200,
"x509ChainDepth": 2,
"verifyCertResult": true,
"verifyHostResult": true,
"ocspStapled": false,
"ocspStapled": false,
"cipherSuite":
Json file içeresinde tlsVersions, supported ve certificateChain dizileri görülmektedir. Her dizi [ ile başlayıp ,ile biter.] Örnek diziler aşağıdaki gibidir. Buradaki dikkat edilmesi gereken tek dizi certificateChain dizisidir. Bu dizi iki nesneden oluşur. Birinci yada ikinci nesnelerin içindeki değerleri okumak için 0 yada 1 indisini seçmeniz gerekecektir. Diğer dizilerde(arrray) sadece 0 yazmanız yeterli olacaktır.
"tlsVersions": [
"TLSv1_1",
"TLSv1_2",
"TLSv1_3"
],
"certificateChain": [
{
"version": 3,
"subject": "CN=asimmisirli.com",
"issuer": "CN=asimmisirli.com",
"subjectCN": "asimmisirli.com",
"subjectAltName": "DNS:asimmisirli.com, DNS:notes.asimmisirli.com, DNS:www.asimmisirli.com, DNS:www.notes.asimmisirli.com",
"signatureAlg": "sha256WithRSAEncryption",
"notBefore": "Jan 20 21:05:41 2021 GMT",
"notAfter": "Apr 20 21:05:41 2021 GMT",
"expired": false,
"serialNo": "03:17:24:51:06:C3:BA:E4:09:5C:9A:5A:70:3F:45:83:B8:26",
"keyUsage": "Digital Signature, Key Encipherment critical",
"extKeyUsage": "TLS Web Server Authentication, TLS Web Client Authentication",
"publicKeyAlg": "RSA",
"publicKeySize": 4096,
"basicConstraints": "CA:FALSE critical",
"subjectKeyIdentifier": "FF:D2:CF:B1:9D:2B:97:D4:F5:D4:CB:67:62:E6:68:44:3A:2F:88:46",
"sha1Fingerprint": "A8:55:7F:B5:BA:5E:7E:62:B8:29:D6:E4:CB:5F:03:C0:DB:6F:46:67"
}, {
"version": 3,
"subject": "CN=R3; O=Let's Encrypt; C=US",
"issuer": "CN=R3; O=Let's Encrypt; C=US",
"subjectCN": "R3",
"signatureAlg": "sha256WithRSAEncryption",
"notBefore": "Oct 7 19:21:40 2020 GMT",
"notAfter": "Sep 29 19:21:40 2021 GMT",
"expired": false,
"serialNo": "40:01:75:04:83:14:A4:C8:21:8C:84:A9:0C:16:CD:DF",
"keyUsage": "Digital Signature, Certificate Sign, CRL Sign critical",
"extKeyUsage": "TLS Web Server Authentication, TLS Web Client Authentication",
"publicKeyAlg": "RSA",
"publicKeySize": 2048,
"basicConstraints": "CA:TRUE, pathlen:0 critical",
"subjectKeyIdentifier": "14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6",
"sha1Fingerprint": "48:50:4E:97:4C:0D:AC:5B:5C:D4:76:C8:20:22:74:B2:4C:8C:71:72"
}
]
supported": [
"AES-128-GCM",
"AES-256-GCM",
"CHACHA20-POLY1305",
"ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-RSA-AES256-SHA",
"AES256-GCM-SHA384",
"AES256-SHA",
"ECDHE-RSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES128-SHA",
"AES128-GCM-SHA256",
"AES128-SHA",
"DES-CBC3-SHA"
]
Aşağıdaki cipherSuite nesnesi içeresinde supported dizi bulunmaktadır.
"cipherSuite": {
"supported": [
"AES-128-GCM",
"AES-256-GCM",
"CHACHA20-POLY1305",
"ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-RSA-AES256-SHA",
"AES256-GCM-SHA384",
"AES256-SHA",
"ECDHE-RSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES128-SHA",
"AES128-GCM-SHA256",
"AES128-SHA",
"DES-CBC3-SHA"
]
},
Ekran çıktısının tamamı şu şekildedir.
{
"host": "asimmisirli.com",
"ip": "93.187.201.200",
"port": 443,
"elapsedTime": 2331,
"tlsVersion": "TLSv1.2",
"cipher": "ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD",
"tempPublicKeyAlg": "ECDH prime256v1",
"tempPublicKeySize": 256,
"secureRenego": true,
"compression": "NONE",
"expansion": "NONE",
"sessionLifetimeHint": 7200,
"tlsVersions": [
"TLSv1_1",
"TLSv1_2",
"TLSv1_3"
],
"cipherSuite": {
"supported": [
"AES-128-GCM",
"AES-256-GCM",
"CHACHA20-POLY1305",
"ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-RSA-AES256-SHA",
"AES256-GCM-SHA384",
"AES256-SHA",
"ECDHE-RSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES128-SHA",
"AES128-GCM-SHA256",
"AES128-SHA",
"DES-CBC3-SHA"
]
},
"x509ChainDepth": 2,
"verifyCertResult": true,
"verifyHostResult": true,
"ocspStapled": false,
"ocspStapled": false,
"certificateChain": [
{
"version": 3,
"subject": "CN=asimmisirli.com",
"issuer": "CN=asimmisirli.com",
"subjectCN": "asimmisirli.com",
"subjectAltName": "DNS:asimmisirli.com, DNS:notes.asimmisirli.com, DNS:www.asimmisirli.com, DNS:www.notes.asimmisirli.com",
"signatureAlg": "sha256WithRSAEncryption",
"notBefore": "Jan 20 21:05:41 2021 GMT",
"notAfter": "Apr 20 21:05:41 2021 GMT",
"expired": false,
"serialNo": "03:17:24:51:06:C3:BA:E4:09:5C:9A:5A:70:3F:45:83:B8:26",
"keyUsage": "Digital Signature, Key Encipherment critical",
"extKeyUsage": "TLS Web Server Authentication, TLS Web Client Authentication",
"publicKeyAlg": "RSA",
"publicKeySize": 4096,
"basicConstraints": "CA:FALSE critical",
"subjectKeyIdentifier": "FF:D2:CF:B1:9D:2B:97:D4:F5:D4:CB:67:62:E6:68:44:3A:2F:88:46",
"sha1Fingerprint": "A8:55:7F:B5:BA:5E:7E:62:B8:29:D6:E4:CB:5F:03:C0:DB:6F:46:67"
}, {
"version": 3,
"subject": "CN=R3; O=Let's Encrypt; C=US",
"issuer": "CN=R3; O=Let's Encrypt; C=US",
"subjectCN": "R3",
"signatureAlg": "sha256WithRSAEncryption",
"notBefore": "Oct 7 19:21:40 2020 GMT",
"notAfter": "Sep 29 19:21:40 2021 GMT",
"expired": false,
"serialNo": "40:01:75:04:83:14:A4:C8:21:8C:84:A9:0C:16:CD:DF",
"keyUsage": "Digital Signature, Certificate Sign, CRL Sign critical",
"extKeyUsage": "TLS Web Server Authentication, TLS Web Client Authentication",
"publicKeyAlg": "RSA",
"publicKeySize": 2048,
"basicConstraints": "CA:TRUE, pathlen:0 critical",
"subjectKeyIdentifier": "14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6",
"sha1Fingerprint": "48:50:4E:97:4C:0D:AC:5B:5C:D4:76:C8:20:22:74:B2:4C:8C:71:72"
} ]
}
PHP ile host,ip, Tlsversion ve subject”CN=R3; O=Let’s Encrypt; C=US” kısımlarını alalım. Bunlar için ilk değer:isim çiftlerini görebiliyoruz olmamız gerekir.
file_get_contents fonksiyonu json dosyasının içeriğini almamız sağlar.
json_decode fonksiyonu dosyayı string ifadeye çevirmeye yarar.
Tek zor gelebilecek satır bu olabilir. Buradaki [1] indis değerini 1 yapma sebebimiz dizinin iki elamanı bulunmasıdır. Okumak istediğimiz değer ikinci birinci indisde tutulan değerdir.
echo "Subject: ".$json['certificateChain'][1]['subject'];
//asimmisirli.com
function readJson(){
$jsonData = file_get_contents("result.json");
$json = json_decode($jsonData,true);
echo "hostname: ".$json['host']."\n";
echo "ip adresi: ".$json['ip']."\n";
echo "tlsVersions: ",$json['tlsVersions'][0]."\n";
echo "Subject: ".$json['certificateChain'][1]['subject'];
}
readJson();
Kod çalıştırıldığı zaman yukarıda ki sonuç verecektir.