구르는돌

블로그 이미지
by soil21
  • Total hit
  • Today hit
  • Yesterday hit

'분류 전체보기'에 해당되는 글 175건

  1. 2015.11.19
    뜻밖의 여행 1
  2. 2015.07.24
    뜻밖의 단식
  3. 2015.01.16
    잡생각 - 각련(롤링 타바코) 말아 피워 볼까? 담배 키워 볼까?
  4. 2014.11.20
    CubieBoard2 도착
  5. 2014.11.20
    오랜만의 블로깅
  6. 2011.10.11
    민족의 영산 지리산을 가다
  7. 2011.02.15
    [android/ssl] Trusting SSL certificates 5
  8. 2011.02.15
    [android/java]https 접근
  9. 2011.02.08
    How to implement Push Notifications for Android
  10. 2011.01.21
    서울대 법인화, 이것이 궁금합니다.

블로그를 방치하고 있다 여행 다녀온 기록을 남기고 싶은데 마땅한 곳이 없어 글을 올린다.


올해 초 가족들과 우연히 가보고 싶은 곳이 어딘지 이야기를 나눌 기회가 있었다. 딸 아이는 여름 한달간의 유럽 여행을 계획하고 있어서 콜롬비아 우유니 사막을 보고 싶다 하고 아내는 유럽이 가고 싶은 가 보다. 나는 예전 부터 쿠바가 가보고 싶었고 일단은 딸아이에게 여행 계획을 만들어 보라 했다.

며칠간을 아내와 딸은 숙덕거린다. 이런저런 부담감에 결국 남들 다 가는 곳으로 결론이 났다.

꽃보다 언니로 인해 유명세를 타고 있는 크로아티아로 가기로 결론이 났고 모든 일정을 딸아이가 짜기로 했다. 여행 중 숙박은 민박,호스텔,에어비엔비로 해결하고 이동은 최대한 대중교통을 이용하기로 하여 짠 일정이 인천 출발 독일 프랑크푸르트를 거쳐 크로아티아를 여행하고 다시 로마로 이동하여 이태리를 돌아본 뒤 나폴리에서 독일 뮌헨을 거쳐 인천으로 오는 다소 긴 일정이다. 다소 긴 일정이 고민스러웠지만 지르지 못하면 이런 기회를 다시 만들기가 어려울 것 같아 동의해 버렸다. 내친 김에 비행기 표까지 예매하고 나니 이젠 빼도박도 못하게 됐다. 이게 3월 정도의 상황이다.

시간은 빠르게 가고 출발일이 가까워 지는데 정작 마무리 될 것이라고 생각했던 일들이 계속 지연되어 출발하기 어려운 상황이다. 역시 비행기 결재를 이미 해 버린 상황이 출발을 가능하게 한다. 에라 일은 일단 잊자.


출발 2-3일 전부터 집안이 분주하다. 긴 여행은 나도 처음이고 아내도 처음이다. 더군다나 아내는 여러 핸디캡 때문에 이런저런 걱정거리가 가득하다. 일단 부딪혀 보자.


프랑크푸르트에 도착해 하루를 목고 다음날 자그레브행 비행기로 갈아타야 하기 때문에 프랑크푸르트에 도착하자마자 중앙역 근처 게스트하우스로 이동해 짐을 푸니 벌써 저녁 8시다. 숙소를 배정받아 문을 열고 들어가니 왠 오스트리아 청년 아니 소년이 자리잡고 있다. 가족실이 없어 이 친구랑 하룻밤을 보내야 한다는 것이 쉽게 적응이 안되는 상황이다. 그런데 이친구 거리낌이 없다. 속옷만 걸치고 다니니 말이다. 애초 그꼴 안보려면 좀더 투자를 했으면 될 터인데 딸아이 나름의 배낭여행 경험이다. 한국에서는 경험하기 어려운 괴상한 경험인데 그런 경우 흔하다고 하니 그게 더 이상하다. 앞으로는 그런 숙소 없을 것이니 걱정하지 말라니 다행이다 싶다.


시간 일정을 체력적인 문제를 생각해서 최대한 여유롭게 일정을 잡아 오다 보니 꼼꼼히 다니기 보단 여유롭게 즐기는 일정이다. 자그레브 공항에 도착해 버스로 터미널로 이동 다시 플리트비체 민박집으로 시외버스로 이동하여 진짜 여행을 준비한다. 꼬박 이틀 만이다. 한국인 여행객이 많이 찾는 민박집 방명록의 여행자 흔적이 정겹다. 홈페이지 하나 없이 이메일로만 예약을 받는 다고 하는데 예약 일정이 꽉차 있다. 블로거의 입소문 만으로 시골구석 민박집이 북적거리는 것은 손님 맞는 노부부의 친절과 배려 인 듯 하다.


거대한 석회암 지대에 위치한 플리트비체 국립공원은 거대한 에메랄드 같다. 계곡을 따라 석회암의 침식으로 인해 만들어진 수많은 호수와 폭포들이 그 물빛과 어우려져 아바타의 녹색 세상을 상상하게 한다. 공원 중간에 위치한 광장의 맥주와 유명하다는 치킨을 주문해서 잠시 휴식을 취하고 공원 트래킹을 마치니 벌써 어둑해진다. 









반응형
AND

요 몇해 꾸준히 해 오던 단식을 걸렀다. 매주 친구들과 어울려 등산을 다니다 보니 아무래도 시간을 내기가 어려웠었던 것 도 있지만 산을 다니면서 건강관리가 어느정도 되었기 때문에 두어해를 그냥 지나친 것이다. 그런데 갑작스레 단식을 시작하게 되었다.

지난 4월 경부터 산에 오르는 것이 무척이나 힘들게 느껴지고 시력이 급격히 나빠지는 느낌을 받았다. 게다가 근자에 거의 매일 술을 마시다 보니 몸에서 이상 신호를 보낸 것이었단 걸 몸이 상한 후에 알게 되었다.

2주전 산행에서 돌아와 조금 더부륵한 상태에서 쏘주 몇잔을 더하고 잠들었다 새벽에 갈증을 느껴 물을 마시는 데 명치가 짜릿하며 수축되는 듯했다. 아침이 되어 속이 뒤틀리기 시작하는데 처음에 위에 문제가 생긴줄 알았으나 통증이 확실히 다르고 몸이 버텨 주지를 못한다. 아무래도 큰 탈이 난 걸 직감하고 일단 무작정 굶어보고 다음날 까지 통증이 가시지 않으면 병원을 가볼 요량을 했다.

다음날 어느 정도 통증이 가라 앉으니 견딜만하여 목요일 병원 예약을 하고 소식을 하며 버텼다. 어찌저찌 소식하며 지냐기를 일주일. 복부 CT 결과를 12일 만에 확인해 보니 의심했던 급성췌장염 이라고 진단이 나왔다. 약국에서 처방된 약을 타가지고 집으로 오는 길에 약제의 효능을 보니 소화효소제,소화액분비억제제 인 것이다. 특별한 치료약이 없고 소화액 분비를 최소화 하여 치료한단다.

참 아플만큼 다 아프고 나서 원인을 알게 된게 좀 억울하기는 하지만 잘 되었다 싶다. 그동안 몸을 너무 혹사 시켜 적당한 시기에 경고 신호를 준 것이라 생각하니 맘이 편해진다. 어치피 취장 효소가 전부 흠수 될때까지 소식하며 약으로 억제하느니 단식을 하는 것이 훨씬 효과적일 것 같다는 결론에 이르니 마음의 준비고 뭐고 당장 시작하기로 쉽게 맘이 먹어진다.

간단한 준비를 마치고 예비단식 과정을 하루로 줄이고 바로 본단식을 시작한다. 몸에 위협으로 다가온 췌장염이 나에겐 또다른 계기를 마련해 줄 것이라 믿는다.

막 시작한 단식 잘 버티고 깨끗한 몸으로 거듭나 보자 !!!

반응형
AND

담배 가격이 두배가량 올랐다. 엄밀히 보자면 담배 가격이 오른게 아니라 세금이 올랐다. 

저정도 금액이면 담배를 조금 줄이면 피울 수 있을 만한 가격인데 건강증진세 거둬다 건강과 관련이 없는 곳에 쓰겠다고 하는 별 싸가지 없는 조세 정책에 동의하지 못하겠다. 담배를 끊어야 겠다는 생각을 누군가 강요하는 것이 마뜩찮지만 어쩔수 없이 강요 당하고 있다.

김근태의원이 보건복지부 장관 시절 국민건강을 위해 담배값 인상을 정책제안 했을때 서민들 위한답시고 반대질 하던 것들이 이제는 앞장서서 찬양 일색이다. 온갖 감언이설로 현혹하고 있는 담뱃세 인상을 보고만 있을 수 없어서 다른 대안을 찾아 보기로 했다.


세금을 좀 덜 내는 방법이 있기는 있더라. 각련이라고 한다. 인터넷에 롤링 타바코로 검색하면 다양한 내용이 있다. 자가 권련 제조 기기 부터 상품 안내까지 다양하다. 내침김에 담배 종자를 검색해 보았더니 담배인삼공사에서 연구 또는 관상용으로 얻을 수 있다는 정보가 있다. 구차하다.

또 다른 방법은 외국 사이트에서 구매할 수 있다고 한다. 며칠전 개발키트를 구매하려고 가입했던 이베이 들어가 tabacco seed를 검색하니 생각보다 많이 검색된다. 버지니아 종도 보이고 켄터키 종도 보인다. 볼리비안 종도 있다. 하우스에 거꾸로 매달아 잎담배 말리던 풍경과 농활 갔을때 건조기에 쪄서 말리던 광경이 그립기도 하고 냅다 구매해 버렸다. 3월 초에 파종해서 5월 초쯤에 정식해 봐야 겠다. 중부지역이라 조금 늦게 심어야 할 것 같기도 하고...


이런 깜찍한 Air mail로 도착했다.







참 부지런한 분들 많다. 상세하게 방법을 정리해 주셨다.

http://bbs3.agora.media.daum.net/gaia/do/story/read?bbsId=S102&articleId=674430

반응형
AND

주문한 큐비보드2 도착하기만을 학수고대하며 기다리다 데스크탑 개발환경으로 구축하려다 대형 사고 쳤다. 분명 우분투 데스크탑 설치중 아무것도 묻지 않았는데 지 맘대로 파티션을 다 날려 버린다.

완전 맨붕...

보드는 도착했는데 아직 모니터 연결할 부품이 도착하지 않아 오래된 IBM 노트복에 개발환경 만드는 중이다. 터미널 환경에서 리눅스 환경은 제법 보아 왔지만 데스크탑은 못 봤다. 

USB 하드에 우분투 설치 하려 했는데 뭔일인지 되질 않는다. 너무 오래된 외장하드인가보다. 그냥 포기하기 싫어 수차례 설치해 봤으나 여전히 되질 않는다.

다행히 나에겐 10여년전 IBM 노트북이 있다. 무려 윈도2000이 깔려 있다. 먼지를 털고 과감히 리눅스 서버(우분투) 설치를 했는데 디펜던시 때문에 설치가 잘 안된다. 근대 왜 서버이지? 추가 패키지 설치 않고서야 겨우 부팅에 성공했다.

엉? 터미널만 뜨네?

그래서 서버인가?


다시 우분투 데스크탑을 설치 도전.

apt-get install --no-install-recommends ubuntu-desktop

이건 쉽네...


이거 이전에 root로 su를 하려는데 잘 안되네.

sudo passwd


다음은 툴체인 설치해야 한다.


sudo apt-get install cpp-arm-linux-gnueabi cpp-arm-linux-gnueabihf build-essential


일단 오늘은 여기까지...

내일은 커널컴파일 환경 만들어 볼 예정

반응형
AND

꽤 별난 취미가 있다.

청국장과 막걸리.

헬리코박터 치료후 주체할 수 없이 몸무게가 불어 다이어트 소재로 선택한 청국장은 새로운 호기심으로 다가왔다. 처음 띄운 청국장에서 엄마의 향수가 느껴졌다. 아무도 가르쳐 주지 않는 방법을 인터넷을 통해 검색하고 옛날을 기억하고 현대 문명을 이용하고 몇번의 시행착오를 거쳐 처음 완성한 날이 아직도 기억이 난다. 지금은 감각적으로 생청국장을 거의 매일 접하고 있다.

그리고 또 하나의 기억이 있다.

어린시절 세무소 직원이 시골 집에 찾아와 밀주를 담그고 있는 지 조사하러 다니면서 집안을 뒤집고 다니던 기억과 엄마가 돌아 가시기 전 언젠가 외할머니께 전수받은 기술로 막걸리를 담그시던 기억이다.

돌아가신지 한참인데 그 기억이 자꾸 기억의 언저리를 맴돌아 또다시 인터넷을 뒤지며 시도 했었다. 지금은 10년 가까이 막걸리를 담고 있으니 자연스럽지만 처음엔 수십차례 실패를 거듭했었다.

지금은 어지간히 비슷한 맛을 내고 있으니 대충은 선무당은 되나 보다.

막걸리에 철학이 있는 것 보다는 엄마의 맛을 기억하는 것이고 그다지 나쁜 맛이 아닌 가양주를 지인들에게 제공한다는 자부심으로 근 10여년을 살고 있다.

오늘은 친구가 쌀을 보내 담궈 달라고 부탁을 한다. 물론 친구들 끼리 회포 풀 요량이다.

나도 이번엔 이쁜 막걸리를 대접하고 싶어 흑미로 밑술하고 찹쌀로 덧술 했다.

흑미의 전분 함량이 형편 없어 식은 밥으로 보충하기는 했지만 불안했다.

오늘 덧술 담그는데 향이 좋다.

분홍빛 청주가 기대된다.


아 그런데 땅콩 발아는 왜 이리 더딘건지....









반응형
AND

등산 모임을 만들라고 배후 조정하셨던 회장님께서, 관악산에서 였을까? 가을에 지리산 들러 남원에 가자고 제안 아닌 제안을 하셨던 기억이 난다. 이번 남원에서도 해외 등반 이야기도 꺼내 놓으시더니 슬그머니 근우에게 묻어 가시더라. 계속된 회장님의 불참으로 지리산행이 잊혀질 무렵 남한산성에 야유회 갔다가 거기서 다시 지리산 이야기가 나오는데 다들 기회가 없어서 그렇지 가보고 싶었던 모양이다. 여유롭게 다녀 오는 것도 좋겠지만 다들 시간 맞추기도 힘들고 해서 무박 산행을 하기로 의기투합 하여 정한 것이 백무동-천왕봉-중산리 코스였다. 물론 코스를 알아본 건 본인이었지만 별다른 이견이 없어 확정 지으려는데 우리의 회장님 께서 무슨 생각이신지 백무동으로 다시 내려오는 코스를 잡으시잔다. 그 이유는 당일날 았았지만...


페북에 이벤을 띄우고 기다리고 있자니 어라~ 원봉이하고 근우네는 가족 동행이네? 이름만 알고 있던 95? 후배 둘도 간다고 하네? 제법 판이 커지는 상황이 걱정이 앞서있는데 회장님께서 덜컥 동기 세분 까지 명단에 올리신다. 안되겠다 싶어 같이 산에 다니는 친구에게 무전기를 구해 볼려고 했으나 일정이 겹쳐서 어렵게 되고 문제가 있겠나 싶어 출발 당일까지 걱정 붙들어 메어 놓고 당일 동서울 터미날로 향했다. 
 

전날 집을 나온 탓에 가는 도중 화장실에서 등산복으로 갈아 입고 터미날에 도착해 보니 좀 이르다. 우리 회장님께 전화가 온다. 술한잔 하고 가고 있는 중이시라는 데 취기가 상당하게 느껴진다. 내일 산에는 절반도 못 오르고 전부 하산하는 게 아닐지 걱정이 앞선다. 이래저래 밤 12시 동서울 터미날에 도착한 회원은 이병호,정혁기,정동실(부부),나,근우와 아들 지훈,원봉이 하고 미경이 그리고 윤희, 후배 평송이하고 재현이 모두 12명이다. 함양에서 합류하기로 한  석원이 까지 하면 13명이라는 올라야 하는데 선두와 후미가 차이가 많이 날 것 같지만 걱정은 일단 제쳐 두기로 한다,  


드디어 출발시간이 되어 지리산행 버스에 오르려는데 5분 간격으로 4대의 차가 대기하고 있다, 예약 승객이 많아서 3대의 버스를 증편한 것 같다, 대략 150여명이 자정에 지리산으로 행하는 것을 보면 지리산은 모두에게 제일봉이란 인식이 있나 보다. 백무동에 버스가 도착할 무렵 차창밖으로 누군가 주차장에서 해드렌턴을 비추며 열심히 석유 버너로 물을 끓이고 있다. 원봉이가 제일 먼저 광경을 보고 석원이 임을 직감했다 한다. 남원에서 늦을 까봐 자지도 않고 미리 와 있었다 하니 그 마음이 더욱 느껴진다.
 

백무동 주차장에서 산행 준비중

주차장에서 정성껏 준비해준 사과와 오이를 나눠 가방에 넣고 따뜻한 커피와 컵라면으로 요기를 한 뒤 두 팀으로 나눠 등산을 시작한다. 선두는 가장 복장과 장비가 좋은 평송이 하고 재현이가 앞서 출발하고 술자신 양반들 하고 근우네 식구 동실형 부부 혁기형과 후미로 출발한 시간이 새벽 4시 반경인가 보다. 오르는 길이 시작 부터 너덜길이어서 관악산 10분 오른게 전부라는 동실형네와 근우 아들 지훈이와 속도를 맞추다 보니 좀처럼 속도가 나질 않는다. 게다가 렌턴을 준비해온 것이 부족해서 중간중간 끼어 불을 비추고 올라가니 더딜 수 밖에... 그렇게 한참을 낑낑거리며 올라가던 중에 누군가 우리 대열 후미에 따라 붙는다. 이렇게 느린 대열에 합류한 그는 우리가 쉬면 같이 쉬고 출발하면 마치 일행 인 것 같이 간다. 대략 6시 반경이 되었을까 희뿌연 새벽이 어둠을 어느 정도 밀어 낸다. 병호형이 먼저 치고 올라 가신다. 조금 지나 혁기형이 후미는 걱정하지 마시라 하여 형의 등산 이력을 알고 있었던 터라 선두를 따라잡기 위해 나도 출발. 참샘까지 20여분 올라가니 병호형이 가고 계신다. 선두가 궁금한 터라 병호형을 뒤로하고 오르다 보니 얼마가지 않아 배낭을 가볍게 하려는 듯 선두 일행이 쉬고 있다. 가만히 보니 한명이 안보인다. 앞서 간 것인지 어쩐지 물어 보니 후미와 같이 올라 오는게 아니냐고 반문하는데 그제서야 후미 일행에 살짝 합류한 그가 재현이 인것 같다는 생각이 버뜩 든다. 오늘 처음 본 후배인데다 어두워서 사람을 분간하기 어려워 그가 재현이 인 것을 모르고 올라 온 것이다. 아니 침낭까지 배낭에 매고 온 친구가 왜 뒤로 처졌는지... 평송이 말로는 몇해 전 지리산을 왔었는데 그때도 힘들어 했었다고 한다. 아무리 그래도 그렇지 아무말도 없이 조용히 귀신처럼 우리 일행 후미에 달라 붙어 올라온게 그저 황당할 따름이다.


조금 뒤 병호형과 합류하여 출발. 장터목에서 뵙기로 하고 조금 속도를 내 본다. 장터목에 도착한 시간이 대략 8시 30분경. 지리산 산행 중 이렇게 좋은 날을 만나기는 처음이다. 천왕봉에서 새벽 일출을 보고 내려온 산객들이 식사 준비가 한참인데 화려한 일출을 자랑하느라 여기저기 난리다. 3-4시간동안 탁 트인 곳을 보지 못하고 올라왔는데 장터목에 이르자 사위가 훤하다. 구름한점 안보이는 데 새벽 안개인지 낮은 봉우리들이 구름에 걸쳐 있는 듯 마치 한폭의 동양화를 보는 느낌이다.
 


장터목에서 바라본 주변


하산 계획이 12시 정각에 현재 위치에서 무조건 내려간다고 약속을 하고 올라 온 길이다. 산의 어둠이 빨리 내리는 데다 백무동 쪽은 동쪽이어서 더 빨리 어두워 질 것 같아 오후 4-5시 전에는 하산하여야 안전 할 것 같아서 그리 정한 것다. 아무래도 후미는 장터목에서 하산해야 할 것 같아 선두로 올라온 병호형,석원이,평송이 하고 천왕봉으로 방향을 잡았다. 너무 쉬다 다시 올라 가는 길이라 또 힘이 든다. 올라가며 고산 지대에 펼처진 주목 군락과 짙푸른 하늘을 보며 다시 힘을 내고 보니 천왕봉이 지척이다. 마지막 암벽지대를 오르고 보니 사방에 더 높은 곳이 없다. 멀리 노고단이 보이고 마치 섬처럼 덕유도 보이는 것 같고 시계에 걸리는 것이 아무 것도 없다.



천왕봉에서 바라본 풍경 그리고 셀카


천왕봉에서 재현이와 근우,지훈이가 올라 왔다는 소식이 들린다. 올라 오신다는 병호형은 아직 감감이고 불편한 볼일 때문에 먼저 장터목으로 향하는데 병호형이 올라 오신다. 오시다 졸려 한숨하고 오신단다. 후미 소식 전하고 장터목에 도착해 보니 근우가 지고 올라온 라면을 끓여 소주 한잔 했다 한다. 한잔이 아니었겠지?
 



제석봉 근처 살아 천년 죽어 천년 주목 군락지


장터목에서 천왕봉까지 왕복 1시간 내외 걸리는데 11시경에 재현이하고 근우가 아들 지훈이하고 올라간다 한다. 12시 되면 천왕봉 못 가더라도 바로 하산하라 이르고 장터 같은 장터목에서 12시 조금 넘어 하산을 시작했다. 천왕봉 올라간 일행도 당연히 하산을 시작할 것이고 병호형이 같이 하산 하신다 하니 먼저 내려가 먼저 하산한 일행과 합류하려고 서둘러 백무동으로 내려왔다. 오후 두시 조금 넘어 도착해 동실형에게 전화하니 이미 남원에 가 계신다고 한다. 하릴없이 배회 하실까봐 빨리 내려 왔는데 이제는 내가 할일이 없다. 하산후 만나기로 한 집에서 묵에 막걸리 시켜 놓고 한잔하며 기다리고 있는데 혁기형,병호형,평송,석원이가 차례로 내려오고 원봉이가 식구들과 내려온다. 마지막으로 재원이가 내려오는데 근우하고 지훈이가 뒤에 많이 쳐져 있는 상태라고 한다. 날은 어두워 지기 시작하고 걱정이 되서 다시 산을 되짚어 올라 가다 하산하는 객들에게 물어 보니 힘들어 한다는 소식을 전한다, 30여분을 다시 올라 가니 임무를 마치고 내려가는 구조대에게 물으니 바로 뒤에 있다 한다. 구조대에게 같이 하산하자 부탁하여 근우,지훈이 백무동으로 무사히 귀환 비로서 맘을 놓는다.
 



*) 백무동에서 부터 함께해준 함양사는 창호,명숙이 부부 반가웠습니다. 지방의 명산을 그 지역 회원 들과 같이 하는 자리가 가끔 있었으면 하는 바람입니다.


반응형
AND
http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

Friday, October 22nd, 2010 | Author: Antoine Hauck

Two weeks ago I got the task to establish TLS secured connections via certificates to a service endpoint.
I thought it’s not a big deal, because the endpoint already uses an EV certificate from a trusted CA (SwissSign) in Switzerland. Therefore I shouldn’t have to worry that the certificate would be considered as untrusted so I don’t have to import it to the trusted certs in the  Java  key store etc.
FAIL! I’ve got a security exception, cert is not trusted. Same problem when I visit the website with the browser. Ok, that’s bad, SwissSign is not such a big player like thawte, so, it needs some time till it will be added to the android trusted CA list. But, when I visit thawte.com, their cert is also not trusted by android. WTF?
Windows Phone and iPhone trust my SwissSign CA and don’t complain.

So, let’s ask google, stackoverflow and the blogosphere. Found a lot of solutions how to disable certificate checking entirely.
Yeah, great, this will solve my problem, my connection will be “secure” and everyone will be able to intercept my connection and inject his own certificate. But I finally found the solution with help from other sites and some testing and debugging.

The Solution

The following main steps are required to achieve a secured connection from trusted Certification Authorities.

  1. Grab all required certificates (root and any intermediate CA’s)
  2. Create a keystore with keytool and the BouncyCastle provider and import the certs
  3. Load the keystore in your android app and use it for the secured connections
    • Don’t use the standard java.net.ssl.HttpsURLConnection for the secure connection. Use the Apache HttpClient (Version 4 atm) library, which is already built-in in android. It’s built on top of the java connection libraries and is, in my opinion, faster, better modularized and easier to understand.

Step 1: Grab the certs

You have to obtain all certificates that build a chain from the endpoint certificate the whole way up to the Root CA. This means, any (if present) Intermediate CA certs and also the Root CA cert. You don’t need to obtain the endpoint certificate.
You can obtain those certs from the chain (if provided) included in the endpoint certificate or from the official site of the issuer (in my case SwissSign).

Ensure that you save the obtained certificates in the Base64 encoded X.509 format. The content should look similar to this:

1
2
3
-----BEGIN CERTIFICATE-----
MIIGqTC.....
-----END CERTIFICATE-----

Step 2: Create the keystore

Download the BouncyCastle Provider and store it to a known location.
Also ensure that you can invoke the keytool command (usually located under the bin folder of your JRE installation).

Now import the obtained certs (don’t import the endpoint cert) into a BouncyCastle formatted keystore.
I didn’t tested it, but I think the order of importing the certificates is important. This means, import the lowermost Intermediate CA certificate first and then all the way up to the Root CA certificate.

With the following command a new keystore (if not already present) with the password mysecret will be created and the Intermediate CA certificate will be imported. I also defined the BouncyCastle provider, where it can be found on my file system and the keystore format. Execute this command for each certificate in the chain.

1
keytool -importcert -v -trustcacerts -file "path_to_cert/interm_ca.cer" -alias IntermediateCA -keystore "res/raw/myKeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret

Verify if the certificates were imported correctly into the keystore:

1
keytool -list -keystore "res/raw/myKeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "path_to_bouncycastle/bcprov-jdk16-145.jar" -storetype BKS -storepass mysecret

Should output the whole chain:

1
2
RootCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 24:77:D9:A8:91:D1:3B:FA:88:2D:C2:FF:F8:CD:33:93
IntermediateCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 98:0F:C3:F8:39:F7:D8:05:07:02:0D:E3:14:5B:29:43

Now you can copy the keystore as a raw resource in your android app under res/raw/

Step 3: Use the keystore in your app

First of all we have to create a custom Apache HttpClient that uses our keystore for HTTPS connections:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class MyHttpClient extends DefaultHttpClient {
 
    final Context context;
 
    public MyHttpClient(Context context) {
        this.context = context;
    }
 
    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        // Register for port 443 our SSLSocketFactory with our keystore
        // to the ConnectionManager
        registry.register(new Scheme("https", newSslSocketFactory(), 443));
        return new SingleClientConnManager(getParams(), registry);
    }
 
    private SSLSocketFactory newSslSocketFactory() {
        try {
            // Get an instance of the Bouncy Castle KeyStore format
            KeyStore trusted = KeyStore.getInstance("BKS");
            // Get the raw resource, which contains the keystore with
            // your trusted certificates (root and any intermediate certs)
            InputStream in = context.getResources().openRawResource(R.raw.mykeystore);
            try {
                // Initialize the keystore with the provided trusted certificates
                // Also provide the password of the keystore
                trusted.load(in, "mysecret".toCharArray());
            } finally {
                in.close();
            }
            // Pass the keystore to the SSLSocketFactory. The factory is responsible
            // for the verification of the server certificate.
            SSLSocketFactory sf = new SSLSocketFactory(trusted);
            // Hostname verification from certificate
            sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
            return sf;
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

We have created our custom HttpClient, now we can just use it for secure connections. For example when we make a GET call to a REST resource.

1
2
3
4
5
6
// Instantiate the custom HttpClient
DefaultHttpClient client = new MyHttpClient(getApplicationContext());
HttpGet get = new HttpGet("https://www.mydomain.ch/rest/contacts/23");
// Execute the GET call and obtain the response
HttpResponse getResponse = client.execute(get);
HttpEntity responseEntity = getResponse.getEntity();

That’s it. Took me long to figure it out, hope this helps and saves you that time.

I really hope that the android platform will implement a better mechanism in future releases for defining which Certification Authorities should be trusted or not or just expand their own trusted CA list. If they don’t, I can’t believe they will get good acceptance from the business sector. Ok, you can control which certificates you want to trust in your app, but you still can’t add thawte as a trusted CA in the android keystore and your browser will always complain about an untrusted CA. The only way I know to eliminate this problem is to root your phone (very user friendly) and add your CA manually to the android keystore.

Feel free to comment.

Tags: 
Category: Codingandroid
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, ortrackback from your own site.

29 Responses

  1. OMG.
    Why is android team doing many things so complicated?!

  2. 2
    Saran 

    Still getting:
    Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: IssuerName(CN=thawte Primary Root CA, OU=”(c) 2006 thawte, Inc. ? For authorized use only”, OU=Certification Services Division, O=”thawte, Inc.”, C=US) does not match SubjectName(CN=Thawte SSL CA, O=”Thawte, Inc.”, C=US) of signing certificate

    :(

    Could you try importing and using certificates from this site:
    https://eu.battle.net/login/en/login.xml?app=armory&locale=en_US&ref=http%3A%2F%2Feu.wowarmory.com%2Fvault%2Fcalendar-feed.xml
    to see if you can get it to work?

  3. Hi Saran

    Hmm… I could reproduce your mentioned exception. Everything looks good with the certificates. I intercepted the HTTPS with Wireshark and saw something very interesting.

    The certificates are sent in the following order from the battle.net server:
    > *.battle.net
    >> thawte Primary Root CA
    >>> Thawte SSL CA (this is the intermedaite cert)

    I really can’t believe that the Cert. Path validation is so bad implemented, that the order how the server sends the certificates is important.
    But I’ve had a customer, whose server was sending the endpoint server certificate twice. And I got similar exceptions in android (IE, Chrome and Firefox weren’t complaining, they also didn’t show the duplicate in the chain). We removed the duplicate from the chain and everything worked fine.
    It’s really possible that the Cert. Path validation really depends on the correct order, which in may opinion sucks.

    I also tried in your case to import the thawte Root cert first and then the Intermediate cert into the keystore, but still got the same exception.

    Maybe you can write to battle.net to change their order, or write your own CertPathValidator or just use the crappier HttpsUrlConnection from the standard java libraries. There you can turn off certificate validation off at all (but you loose a lot of security).

    Hope this helps you a bit.

    Greetz

  4. 4
    Saran 

    Thanks for verifying, Antoine.

    I tried reverse-importing the certs into the store, but even though I imported them in this order:
    > *.battle.net
    >> thawte Primary Root CA
    >>> Thawte SSL CA (this is the intermedaite cert)

    I got this list:
    Keystore type: BKS
    Keystore provider: BC

    Your keystore contains 3 entries

    thawte Primary Root CA, 26.10.2010., trustedCertEntry,
    Certificate fingerprint (MD5): 8C:CA:DC:0B:22:CE:F5:BE:72:AC:41:1A:11:A8:D8:12
    *.battle.net, 26.10.2010., trustedCertEntry,
    Certificate fingerprint (MD5): FC:1C:1D:FE:FF:4A:AE:EA:11:4B:54:8C:2B:F0:C1:51
    Thawte SSL CA, 26.10.2010., trustedCertEntry,
    Certificate fingerprint (MD5): EB:A3:71:66:38:5E:3E:F4:24:64:ED:97:52:E9:9F:1B

    When I used that keystore, I got a different error:

    10-26 20:43:23.743: WARN/System.err(5423): javax.net.ssl.SSLException: Not trusted server certificate
    10-26 20:43:23.743: WARN/System.err(5423): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
    10-26 20:43:23.753: WARN/System.err(5423): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    10-26 20:43:23.763: WARN/System.err(5423): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    10-26 20:43:23.763: WARN/System.err(5423): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    10-26 20:43:23.763: WARN/System.err(5423): at org.homedns.saran.android.wowcalendarsync.network.NetworkUtilities.authenticateWithPass(NetworkUtilities.java:344)
    10-26 20:43:23.763: WARN/System.err(5423): at org.homedns.saran.android.wowcalendarsync.network.NetworkUtilities$1.run(NetworkUtilities.java:164)
    10-26 20:43:23.763: WARN/System.err(5423): at org.homedns.saran.android.wowcalendarsync.network.NetworkUtilities$5.run(NetworkUtilities.java:276)
    10-26 20:43:23.763: WARN/System.err(5423): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Could not validate certificate signature.
    10-26 20:43:23.763: WARN/System.err(5423): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:168)
    10-26 20:43:23.763: WARN/System.err(5423): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
    10-26 20:43:23.773: WARN/System.err(5423): … 12 more
    10-26 20:43:23.773: WARN/System.err(5423): Caused by: java.security.cert.CertPathValidatorException: Could not validate certificate signature.
    10-26 20:43:23.793: WARN/System.err(5423): at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:342)
    10-26 20:43:23.793: WARN/System.err(5423): at java.security.cert.CertPathValidator.validate(CertPathValidator.java:202)
    10-26 20:43:23.793: WARN/System.err(5423): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:164)
    10-26 20:43:23.793: WARN/System.err(5423): … 13 more
    10-26 20:43:23.793: WARN/System.err(5423): Caused by: java.security.SignatureException: Signature was not verified.
    10-26 20:43:23.803: WARN/System.err(5423): at org.apache.harmony.security.provider.cert.X509CertImpl.fastVerify(X509CertImpl.java:601)
    10-26 20:43:23.803: WARN/System.err(5423): at org.apache.harmony.security.provider.cert.X509CertImpl.verify(X509CertImpl.java:544)
    10-26 20:43:23.803: WARN/System.err(5423): at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:337)
    10-26 20:43:23.803: WARN/System.err(5423): … 15 more

    Using BC version you suggested and used keytool from these Java plugins (on Win7 64bit):
    jdk1.6.0_20 64bit
    jdk1.6.0_22 64bit
    jdk1.6.0_20 32bit

    I used this to retrieve certs:
    openssl s_client -connect eu.battle.net:443 -showcerts

  5. Hi Saran

    You should NOT place the *.battle.net certificate in your keystore. Your keystore should only contain the trusted issuers (the Root CA and any intermediate CA’s) and not the endpoint certificate itself.

    The check if your endpoint certificate is valid is done with several other criterias, like the hostname verification (does the cert correspond to the presented site).

    Please let me know if this is working.

  6. 6
    Saran 

    Yes, I tried it also with only Intermediate and Root (with having tried each of them imported as 1st at one time). Same result :(

  7. 7
    Saran 

    I’ve asked a question on StackOverflow:
    http://stackoverflow.com/questions/4115101/apache-httpclient-on-android-producing-certpathvalidatorexception-issuername

    Hopefully, someone will think of a solution…

  8. Hi Seran

    I tried to answer your question on stackoverflow. Hope it helps ;)

  9. 9
    Andreas 

    Thanks so much for this most useful info!

  10. 10
    Nilz 

    Hi Antoine,

    Your blog aims to tackle the exact problem I’m faced with, however I cannot get your solution to work.

    I keep getting the following in LogCat:

    11-19 15:12:34.777: ERROR/OpenSSLSocketImpl(520): Unknown error 5 during connect
    11-19 15:12:34.777: WARN/System.err(520): java.io.IOException: SSL handshake failure: I/O error during system call, Unknown error: 0
    11-19 15:12:34.786: WARN/System.err(520): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method)
    11-19 15:12:34.786: WARN/System.err(520): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:305)
    11-19 15:12:34.786: WARN/System.err(520): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
    11-19 15:12:34.786: WARN/System.err(520): at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:321)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:129)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    11-19 15:12:34.795: WARN/System.err(520): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    11-19 15:12:34.795: WARN/System.err(520): at me.test.TempActivity.onCreate(TempActivity.java:30)
    11-19 15:12:34.805: WARN/System.err(520): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    11-19 15:12:34.805: WARN/System.err(520): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    11-19 15:12:34.814: WARN/System.err(520): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    11-19 15:12:34.814: WARN/System.err(520): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    11-19 15:12:34.814: WARN/System.err(520): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    11-19 15:12:34.814: WARN/System.err(520): at android.os.Handler.dispatchMessage(Handler.java:99)
    11-19 15:12:34.814: WARN/System.err(520): at android.os.Looper.loop(Looper.java:123)
    11-19 15:12:34.814: WARN/System.err(520): at android.app.ActivityThread.main(ActivityThread.java:4363)
    11-19 15:12:34.814: WARN/System.err(520): at java.lang.reflect.Method.invokeNative(Native Method)
    11-19 15:12:34.814: WARN/System.err(520): at java.lang.reflect.Method.invoke(Method.java:521)
    11-19 15:12:34.814: WARN/System.err(520): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    11-19 15:12:34.814: WARN/System.err(520): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    11-19 15:12:34.826: WARN/System.err(520): at dalvik.system.NativeStart.main(Native Method)

    Have you seen this before? Do you know what it means. Unfortunately I cannot share the certificate with you, but I can tell you that is was a p12 certificate which I exported to a X509 in windows xp.

    I really need help on this issue, any guidance would be a great help.

    Cheers,
    Nilz.

  11. 11
    Vlad 

    I tried to implemented and getting error. Any ideas?
    Here is my cert list

    {2df05992-4d0f-48af-9d89-342c0af1d238}, Nov 19, 2010, PrivateKeyEntry,
    Certificate fingerprint (MD5): 90:99:AC:3E:0A:22:7C:81:26:EC:6F:F4:04:F5:BB:A5
    GeotrustCA, Nov 19, 2010, trustedCertEntry,
    Certificate fingerprint (MD5): 67:CB:9D:C0:13:24:8A:82:9B:B2:17:1E:D1:1B:EC:D4

    11-19 12:34:42.577: WARN/System.err(4233): java.net.SocketException: The operation timed out
    11-19 12:34:42.587: WARN/System.err(4233): at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
    11-19 12:34:42.587: WARN/System.err(4233): at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
    11-19 12:34:42.597: WARN/System.err(4233): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
    11-19 12:34:42.597: WARN/System.err(4233): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
    11-19 12:34:42.607: WARN/System.err(4233): at java.net.Socket.connect(Socket.java:1055)
    11-19 12:34:42.607: WARN/System.err(4233): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
    11-19 12:34:42.607: WARN/System.err(4233): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
    11-19 12:34:42.617: WARN/System.err(4233): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    11-19 12:34:42.617: WARN/System.err(4233): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    11-19 12:34:42.617: WARN/System.err(4233): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
    11-19 12:34:42.617: WARN/System.err(4233): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    11-19 12:34:42.617: WARN/System.err(4233): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    11-19 12:34:42.617: WARN/System.err(4233): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)

  12. 12
    Nick 

    I am very please with your tutorial; it is very thorough, but I am having flaky success.

    I am trying to use it to access Google’s login url: https://www.google.com/accounts/ClientLogin.

    I built everything just the way you detailed. Then the first time I ran it I got the expected response, but every time after that I got “javax.net.ssl.SSLException: Not trusted server certificate”.

    I’ve managed to get the desired response about 3 times, but nothing I change seems to have an effect. I sure would appreciate your help. I don’t know why Android makes this so difficult.

  13. 13
    swapnil 

    Hi,

    I like to know how google manage security certificate on Android. Reason i am asking is i came across a webcast by google for android and in that they mention storing certificate on Android device and using it instead of passing it everytime and accordingly this reduces data connection overhead.

    I am trying to achieve something similar.. i dont want to pass and receive server/client secure certificate everytime.
    My application is kind of pushengine without google PUSH API.

    Awaiting your views.

  14. Hi there

    Sorry for the late response, I was away for a couple of days.

    @Nilz:
    Never seen this error before. Can you provide some code (of the SSL Factory)? Maybe this helps:http://stackoverflow.com/questions/2899079/custom-ssl-handling-stopped-working-on-android-2-2-froyo

    @Vlad:
    The error is indicating that your operation timed out. Does your app executes the request to the server? You could intercept the traffic between the emulator and server for example with Wireshark. Sometimes the reply from the server could also be helpful.

    @Nick:
    Thanks.
    I think the Google ClientLogin uses a different approach.
    http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html

    @swapnil:
    Do you have the link or name of the mentioned webcast?
    I think I didn’t understand your question. What do you mean with storing the certificate and not passing it every time? The certificates are just passed during the establishment of the secure connection. After the cert. exchange (when all certificates are considered as trusted and valid) session keys are generated to secure the actual data. The session keys are valid until the connection closes.

    Found an useful link: http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

    Greetz
    Antoine

  15. 15
    Gergo 

    Hi Antoine

    a very nice tutorial. Thank for that.
    My question is regarding client authentication. As far as i saw, the Apache HttpClient cannot handle this situation. When using only Server Auth, it works perfect , but when setting the Server to authenticate the client it fails.Do you know something about it ?
    I am trying it now the “Java way” with SSL Socket , but it fails too with ” Not trusted Server certifiate :(
    PLZ drop me an email if you have knowledge about turials or articles dealing with that problem

    Thanks in advance
    Gergo

  16. 16
    Gergo 

    Hi Antoine
    i figured out the problem with the “Not Trusted server certificate”
    It was the TrustManager. For some reason i do not know, The Trustmanager could not authenticate the certificate of the server. I have implemented my own.
    Client authentication works now.
    but if you have any idea how to do it with the Apache HttpClient, please drop me some line
    Thanks
    Gergo

  17. 17
    Lys 

    Hi,
    I found your post while looking for a solution to a similar problem. What I need is to connect to the remote server and download the cert for my app to use. Basically steps 1 and 2 but within the app itself. Any thoughts on how to do that?
    Thanks

  18. 18
    Martin 

    Hi,
    very useful, but I’m getting stuck with a 404 reply in the response. Have you any ideas to the reason for this?
    Wireshark shows a encrypted data load, length 288, which could corespond to the expected return from the Webservice

    Thanks

  19. @Gergo
    Hmm… AFAIK the Apache HttpClient is not able to handle client authentication with cert.

    @Lys
    Didn’t look very deep into those links.
    How to create your own keystore:
    http://www.coderanch.com/t/133048/Security/do-programmatically-create-keystore-import
    How to obtain the certificate from the site:
    http://helpdesk.objects.com.au/java/how-do-i-programatically-extract-a-certificate-from-a-site-and-add-it-to-my-keystore

    @Martin
    Can you access your resource via browser (without 404)?
    Maybe your HTTP headers are wrong and the server returns a 404 (but another error code would be much more appropriate in this case). In my opinion 288 bytes is not very much. Maybe the 404 error itself.

    You can try two approaches to see what’s going on with the response:
    1. If you have the private key of the webservice (I doubt that) you can encrypt the traffic with Wireshark. See http://htluo.blogspot.com/2009/01/decrypt-https-traffic-with-wireshark.html
    2. This is the PITA alternative, but you DON’T need the private key from the webservice. You can download fiddler2 (www.fiddler2.com), add the proxy certificate from fiddler (or create a new one to match the hostname to your webservice) to the app keystore. Then add an argument in your Android Emulator to use the fiddler proxy to connect to the webservice. Seehttp://mrrask.wordpress.com/2009/10/01/setting-up-the-android-emulator-for-http-debugging-using-fiddler2/ Your app in the emulator will connect to fiddler and there you can see the decrypted payload.

  20. 20
    pyko 

    Hi Antonie,
    Firstly, thanks heaps for this post ? it’s really really helpful & well written too! :D

    Implemented your solution and bumping into similar problem to Nick ? where the authentication is quite flaky :( though i’m not authing with Google accounts…

    Without changing anything, sometimes logging in will work first attempt… other times it requires several attempts to work..

    Looking at my stacktrace, I would’ve thought I got the order wrong…but I double checked that and what doesn’t make sense is that it sometimes works….
    javax.net.ssl.SSLException: Not trusted server certificate
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92)
    at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164)
    ….etc….
    Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: IssuerName(CN=thawte Primary Root CA, OU=”(c) 2006 thawte, Inc. ? For authorized use only”, OU=Certification Services Division, O=”thawte, Inc.”, C=US) does not match SubjectName(CN=Thawte SSL CA, O=”Thawte, Inc.”, C=US) of signing certificate
    at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:168)
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
    … 24 more
    Caused by: java.security.cert.CertPathValidatorException: IssuerName(CN=thawte Primary Root CA, OU=”(c) 2006 thawte, Inc. ? For authorized use only”, OU=Certification Services Division, O=”thawte, Inc.”, C=US) does not match SubjectName(CN=Thawte SSL CA, O=”Thawte, Inc.”, C=US) of signing certificate
    at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:373)
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:202)
    at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:164)
    … 25 more

  21. 21
    Martin 

    Hi again,
    the Ws can be browsed both on real device/emulator and from pc without problems. Cert chain is exported from firefox (https://google.com/accounts Worked this way).

    http works fine. I’ll investigate the output from wireshark

    Thnx
    martin

  22. 22
    Martin 

    no difference between wireshark output from http and https

    very strange

  23. 23
    allen 

    Hey everyone,

    I think I was able to find a fix to the sporadic nature of this solution. For those who used Antoine’s solution, but get inconsistent behavior, try importing just the root cert into your keystore and not the intermediate cert. not sure if this only worked for our setup with our servers, but it worked for us. I noticed all the exceptions I got were because it was trying to compare the root cert against the intermediate. Hope that helps!

  24. 24
    Martin 

    Hi,
    I finally found a solution for the 404 problem.
    the Webservice I’m calling is a .Net wcf service on an Intranet server, and the config of the ws was the problem.

    After doing a binding modification (http://www.codemeit.com/wcf/wcf-wsdl-xsdimport-schemalocations-link-to-local-machine-name-not-domain-name-while-hosted-in-iis.html)
    a super simple config file solved the problem

    I tried many other config solutions, but this one worked for me. Hope this can help others

    /Martin

  25. @pyko
    I think that the order of the present certificates could still be the problem, especially when you are connecting to an endpoint, which is behind a web farm. One miss configured web server could send the certificates in the wrong order, another one not.
    Check with Wireshark etc. if the order is correct.

    If you are not able to change the certificate order of the webserver, you could change the order programmatically.

    More info about changing the order programmatically can be found on this stackoverflow topic:http://stackoverflow.com/questions/4115101/apache-httpclient-on-android-producing-certpathvalidatorexception-issuername/4199518#4199518

    @allen:
    AFAIK every involved certificate must be in the keystore. Never tried to remove the intermediate cert. But I could imagine, that if the order of the certificates is sent wrong from the webserver, for example the first entry is the Root CA and not the Intermediate, then the Bouncy Castle checks only against the one and only Root CA certificate in the keystore and completes the checking. But this is just an assumption. You can also look at the link that I posted to pyko.

  26. 26
    Teresa 

    Hi Antoine,

    Very pleased with this tutorial. In my app, I am trying to send a soap request using ksoap2, which is working fine in my test environment. If I am trying to connect to a secured site, getting ‘Not trusted server certificate’. I dont want to bypass the certificate check like it was mentioned in some of the blogs. Is it possible to implement your solution with soap. Here is how I am sending the request.

    HttpsTransportSE transport = new HttpsTransportSE(URL, 443, “”, 60000);
    transport.call(SOAP_ACTION, envelope);

    Appreciate your help.

    Thanks,
    Teresa

  27. 27
    Matt 

    Any luck finding an answer to Teresa’s question? I’m having the same problem. I’m fairly sure the 3rd parameter is the keystore with the certificate, but i’m not sure how to find that? Can you help?

    Thanks,
    Matt

  28. 28
    pyko 

    @allen & @Antoine
    Strangely enough just importing the root CA worked! I am able to login successfully everytime now (assuming I enter the correct credentials of course)

  29. @Martin
    I’m glad that you solved the problem. Thank you for commenting the solution here.

    @pyko
    Thank you very much for your testing.

    @Teresa & @Matt
    I’m sorry. I have no idea how to solve this one. Never used ksoap2. I can’t find any useful reference for the parameters in the HttpsTransportSE constructor. Maybe this entry helps a bit:http://stackoverflow.com/questions/2248147/andoird-ksoap2-https-problem/4438993#4438993

    Keep on going and please let me know if you found a solution. Thanks

반응형
AND
[code]
public class Test extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        StringBuilder content = new StringBuilder();
        
        try
        {
            String data = "userid=???&password=???";
            URL url = new URL("https://url~~");
            
            HttpURLConnection http = null;
            
            if (url.getProtocol().toLowerCase().equals("https")) {
                trustAllHosts();
                HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                https.setHostnameVerifier(DO_NOT_VERIFY);
                http = https;
            } else {
                http = (HttpURLConnection) url.openConnection();
            }
            http.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter(http.getOutputStream());
            wr.write(data);
            wr.flush();
            
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(http.getInputStream()));

            String line;

            while ((line = bufferedReader.readLine()) != null)
            {
              content.append(line + "\n");
            }
            Log.i("content", content.toString());
            wr.close();
            bufferedReader.close();
        }
        catch(Exception e)
        {
        }
    }
    
    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[] {};
                }

                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType)
                        throws java.security.cert.CertificateException {
                    // TODO Auto-generated method stub
                    
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType)
                        throws java.security.cert.CertificateException {
                    // TODO Auto-generated method stub
                    
                }
        } };

        // Install the all-trusting trust manager
        try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection
                                .setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
    
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };
}
[/code]

반응형
AND
http://tokudu.com/2010/how-to-implement-push-notifications-for-android/ 

안드로이드에서 Push notification을 구현하기 위한 방법으로 XMPP를 이용하는 방법과 MQTT를 이용하는 방법이 있다..
여기서는 MQTT를 이용하여 C2DM을 지원하지 않는 안드로이드 2.1이하 버전에서 PUSH notification을 지원하기 위한 방법에 대해 설명한다.

안드로이드 앱에서 Push notification을 지원하기 위한 방안은 3가지정도의 방안이 있다.
1. 폴링
  이게 진정 push일까?? 어쨌든 단말에서 주기적으로 서버에 가져갈 메세지가 있는지 확인하여 push event를 수신할 수 있다. 
  장점 : 구현이 쉽고 비용도 안든다.
  단정 : 실시간이 아니지 않은가... 이런 젝일~!, 이는 배터리소모까지 발생시킨다.. 끔찍하다.이에 대한 정보는 링크를 참조하자. https://labs.ericsson.com/apis/mobile-java-push/blog/save-device-battery-mobile-java-push
2. SMS
  안드로이드는 SMS message의 가로채기가 가능하다. 서버에서 특별한 SMS를 단말에 날리면 앱에서는 모든 SMS 메세지를 가로채서 서버에서 날린것인지 확인하고 Popup Message를 띄울 수 있을것이다.
  장점 : 구현이 쉽다. 완전한 실시간이 보장된다. 알려진 솔루션도 있다. Ericsson lab의 자료를 참조하라 https://labs.ericsson.com/apis/mobile-java-push/
  단점 : 비용이 발생한다.
3. 끊김없는 TCP/IP
  폰과 서버가 TCP/IP 연결을 유지한다. 그리고 주기적으로 keepalive메세지를 날린다. 서버는 이 연결을 통해 필요할경우 메세지를 보낸다.
  장점 : 완전한 실시간이 보장된다.
  단점 : 신뢰성을 보장하는 구현이 아주 까다롭다. 폰과 서버쪽 모두 구현하려면 이야기가 복잡해진다. 또 안드로이드는 low memory등의 상황에서 서비스가 종료될 수도 있다. 그러면 동작을 안할것이다. 또한 단말이 sleep에 들어가지 않아야 하므로 유저들은 배터리문제로 클레임을 걸수 있다.

1, 2의 방법은 중대한 단점이 있다. 3번째는 가능하기는 하다. 하지만 먼가 개운치는 않다.

구글링을 통해서 몇몇 개발자들의 TCP/IP방식의 몇가지 좋은 시도를 찾았다.
Josh guilfoyle은 AlarmManager에 기반하여  오랬동안 살아있는 connection을 어떻게 만들것인가에 대해 언급했다. 그는 백그라운드에서 동작하면서 그 연결을 만들어내는 멋진 샘플코드도 제공하였다. http://devtcg.blogspot.com/2009/01/push-services-implementing-persistent.html

Dave Rea는  Deacon project를 최근에 시작했다. Meteor server상에서 comet technology를 사용하여 안드로이드에서 push notification을 지원하는 3rd party library를 개발할 예정이다. 아주 초기 단계이다.  http://deacon.daverea.com/

Dale Lane는 IBM에서 개발한 MQTT protocol로 android에서 push notification을 지원하는것과 관련한 많은 자료를 만들었으며 아주 훌룡한 샘플코드도 제공한다. http://dalelane.co.uk/blog/?p=938

위의 훌룡한 시도들을 기반으로 예제를 만들었다. 이 는 Josh Guilfoyle의 TestKeepAlive project 와 Dale Lane의 MQTT를 이용한 것이다.

TestKeepAlive project의 문제점은 raw TCP connection을 만든다는 것이다. 이는 push를 관리하는 서버를 별도로 작성해야 한다는것을 의미한다. MQTT를 이용한 예제의 경우 서버작업을 위해 IBM의 MQTT broker를 이용한다. 

mqtt는 publish/subscribe messaging protocol로 가볍게 설계 되었다. 가볍게 설계 되었다는 것은 '저전력 소모'를 지원한다는 것이다. 이는 끊김없는 TCP/IP connection을 고려해야 하는 모바일환경에서 가장 이상적인 해결책이다. 다만 MQTT의 단점은 개인의 프라이버시 보장이 약하다는 것등 몇가지 단점이 있기는 하다.

KeepAliveService와 raw TCP/IP connection을 MQTT connection으로 변경하는 것이 아이디어의 핵심이다.

Architecture
예제에서는 서버에서 PHP를 사용하였다. 이는 Simple Asynchronous Messaging library(http://project-sam.awardspace.com/)를 사용하였다.



wmqtt.tar 는 IBM에서 제공하는 MQTT protocol의 간단한 drop-in implementation이다.  http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006에서 다운로드 가능하다. 

Really Small Message Broker(RSMB)는 간단한 MQTT broker로 마찬가지로 IBM에서 제공한다. http://www.alphaworks.ibm.com/tech/rsmb에서 다운가능하다. 1833포트가 디폴트로 동작한다. 위 아키텍쳐에서 서버로부터 메세지를 받아서 단말에 전송하는 역할을 한다. RSMB는 Mosquitto server(http://mosquitto.atchoo.org/)로 변경이 가능하다.
SAM은 MQTT와 다른 요소들을 모아놓은 PHP library이다. http://pecl.php.net/package/sam/download/0.2.0에서 다운가능하다.

send_mqtt.php는 POST를 통해 메세지를 받아서 SAM을 이용하여 broker에 메세지를 전달하는 역할을 한다.

Sample code and Demo

이 예제는 TextView하나와 두개의 Button이 있다. 폰에 설치 후 서비스를 시작한 후 http://tokudu.com/demo/android-push/  에 가서 deviceID를 입력하고 메세지를 입력하라. 그러고 난 후 "Send Push Message"를 누르면 폰에서 메세지를 받을 것이다. 


MQTT는 사실 안드로이드에서 Push를 지원하기 위한 최적의 방법은 아니다. 하지만 잘 동작한다. MQTT의 가장 취약한 점은 broker가 동작하는 IP와 PORT정보를 누군가 알아낸다면 모든 Push message들을 가로챌수 있다는 것이다. 따라서 그런 정보를 encrypt하는것은 좋은 대안이 될것이다. 대안으로 당신만의 broker를 작성하여 MQTT에 인증을 추가하는것이 있을 수 있다.

이 예제는 더 테스트되어야 한다. 안정성은 보장못한다. 연결이 끊어지거나 예외상황들에 대한 처리가 더 개선되어야 한다. 

반응형
AND
서울대 법인화, 이것이 궁금합니다. 


<사실 관계>

질문 1. 
  서울대 법인화 법안은 어떤 절차를 거쳐 만들어졌나요? 찬성론의 요지와 법안의 골자는 무엇입니까? 이제 서울대는 사립대가 되는 건가요?
=> 법안은 국무회의가 2009년 12월 8일에 정부입법안(C)으로 확정하여 국회에 제출한 것이지만, 서울대가 원안(A)을 2009년 7월에 만들어 교육과학기술부에 제출하고 교과부가 이를 수정하여 입법예고(B)했습니다. 서울대 본부는 C안이 문제가 있다고 보고 2009년 12월 말에 국회에 수정안(D)을 제출했습니다. 
  애초 A안은 내부자 중심의 지배구조와 재정지원에 관한 조항이 들어있어 찬성론자들이 원하는 자율성의 제고와 재정 확보를 상당한 수준에서 보장했습니다. 그러나 A안이 B안에서 C안으로 바뀌는 과정에서 지배구조는 외부자 위주로 바뀌고 정부의 통제는 더 강화되고 재정보장책도 확실치 않아 대학본부는 D안을 제출했던 것입니다. 그런데 2010년 12월 8일 국회는 C안을 원안 그대로 날치기 통과시켰습니다.
  서울대가 법인화된다고 하여 일반 사립대와 똑같은 존재가 되지는 않습니다. 국가가 여전히 학교의 주인이라는 점에서 일반 사립대와는 다릅니다. 하지만 이사회가 대학의 주인이 됨으로써 국립대학법인 서울대학교는 사립대와 유사한 위치에 놓입니다. 교직원은 법인의 피고용인이 되고 학생은 교육이라는 상품의 소비자가 됩니다. 실제로 앞으로 교직원은 공무원연금에서 사학연금으로 이관되고, 많은 부분에서 ‘민법’과 ‘사립학교법’의 적용을 받게 됩니다.

질문 2. 
  법인화는 서울대가 자청해서 입법을 청원해온 것으로 아는데 반대하시는 쪽에서는 입법청원시 의견 반영을 위해 어떻게 하셨는지요?
=> 반대하는 의견은 제대로 수렴된 적이 없습니다. 대학본부가 A안을 만드는 과정에서 학내 구성원들의 의견을 모아 반영하려는 진지한 노력은 아예 없었고, 법인화의 구체적 내용이 2009년 7월까지도 비밀에 붙여졌기에 적절하게 대응할 수 없었습니다. 서울대 교수협의회는 법인화는 찬성하지만 본부와는 다른 법인화안을 만들어 책자로도 발행했지만, 이마저도 대학본부는 반영하지 않았습니다. 
  반대 측에서는 2009년 여름부터 대응하여 성명서나 토론회를 통해 반대의견을 개진했으나 본부에서는 무시하였습니다. 본부는 각 단과대학을 돌면서 공청회를 개최 하였지만, 자신들의 법인화법안을 홍보하는 자리에 불과했고, 교수들의 반대 의견을 수렴하려는 진지한 자세는 전혀 없었습니다. 게다가 대학의 자율성과 재정확보와 관련된 핵심적 사안에 대한 교수들의 질문에 대해서는, 교과부와 긴밀하게 협의하고 있는 대외비 사항이라는 이유로 구체적인 답변을 제시하지 않았습니다. 
  서울대 내에서 법인화 입법이 공식화된 것은 대의기구의 지위를 가진 대학평의원회에서의 의결을 통해서입니다. 교수들의 대표를 중심으로 구성된 평의원회에서 법인화를 찬성하는 의결을 했습니다. 이 의결은 법인화 추진에 대한 절차적 정당성을 확보하는 것이었고, 이것이 본부 측에서 법인화안이 학내 구성원들의 의사를 물어서 결정된 것이라고 홍보하는 이유가 되었습니다. 하지만 서울대의 대학평의원회는 대의기구로서의 실질적 자격과 요건을 전혀 갖추지 못한 기구입니다. 50여명 정도로 구성된 평의원회는 대부분 각 단과대학의 고참 교수들이 차지하고 있고, 평의원들의 선출마저도 결코 민주적인 절차에 의해서 이루어진 것이 아닙니다. 따라서 평의원회의 의결이 현재 서울대의 제도와 규정에 의한 절차적 정당성은 확보하는 것이라 하더라도, 도덕적이고 실질적인 차원의 정당성은 전혀 확보하지 못한 것 입니다. 이러한 상황에서 2010년 1월 법인화에 반대하는 학내 구성원들이 서울대 법인화반대 공대위를 만들게 된 것입니다. 

질문 3. 
  선진국의 대학 중에서 법인화하여 성공한 곳도 있지 않나요? 미국과 일본의 국립대는 모두 법인이라 들었는데, 그 곳과 서울대는 어떤 환경 차이가 있습니까? 
=> 대학의 성격은 근본적으로 각국의 국가형성과정을 반영합니다. 유럽과 대부분의 제3세계 국가에는 아예 사립대학이란 개념 자체가 없기에 대학이 법인인 경우 기본적으로 ‘공익형 재단’의 성격을 갖습니다. 미국에는 국립대학이 없고 모든 대학이 형태가 다르지만 법인입니다. 4천개에 달하는 대학이 모두 법인이지만 교육과 연구 능력에서 천차만별임은 오로지 ‘법인’이라는 대학지배구조가 대학발전의 관건이 아님을 말해줍니다. 또한, 미국의 대학이 모두 법인인 것은 미국의 고등교육이 사립대학을 중심으로 시작되고, 발전해 왔다는 역사적 과정과 관계가 깊습니다. 
  여기서 흥미로운 것은 사립대학을 중심으로 발전한 미국의 고등교육에서 제2차 세계대전 이후부터는 국가의 역할이 점차 증가하고 있다는 사실입니다. 미국에서 public university인 주립대학이 획기적으로 늘어난 때가 제2차 세계대전 이후이고, 실제로 이 과정 속에서 많은 사립대학들이 주립으로 전환하기도 하였습니다. 뉴욕주립대학인 SUNY-Buffalo나 뉴저지주립대학인 Rutgers대학 등이 이러한 과정에서 주립대학으로 자리잡게 되었습니다. 즉, 사립대학을 중심으로 발전하여온 미국의 대학교육을 이해하기 위해서는 지금 현재 미국의 대학들이 법인이냐 아니냐 라는 식의 평면적 이해보다는 국가가 공공성의 가치를 고등교육에서 실현하기 위해 어떠한 노력을 해왔는가라는 부분에 대한 역사적 이해가 필요하다는 것입니다. 
  일본은 2004년에 모든 국립대학이 행정개혁의 일환으로 법인화되었는데, 대학의 성격이 미국의 그것과 달라 법인화된 이후에도 총장직선제가 그대로 살아있고 이사회가 내부자 중심입니다. 아마 법인화의 다른 성공 사례로 싱가포르 국립대학을 드는 사람도 있을 것입니다. 싱가포르 국립대학은 1990년대 중반까지만 해도 학부생들의 교육을 중심으로 하는 연구력이 매우 떨어지는 대학이었습니다. 하지만 2000년대 중반이 되면 싱가포르 국립대학은 아시아의 가장 우수한 연구대학 중의 하나로 자리매김하게 되고, 2005년에는 법인으로 전환이 됩니다. 
  많은 사람들이 싱가포르 국립대학의 성공을 법인화 때문이라고 오해하고 있습니다. 그러나 싱가포르 국립대학의 사례를 서울대에 적용하기는 어렵습니다. 싱가포르 국립대학은 싱가포르라는 도시국가의 유일한 종합대학이기 때문에, 대학의 학문과 교육의 발전을 위한 국가의 의지가 고스란히 반영될 수 있는 여건에 놓여 있습니다. 따라서 싱가포르 정부가 싱가포르 국립대학의 법인화를 추진하면서 엄청난 재정 지원을 해 줄 수 있었습니다. 하지만 서울대는 여러 국립대학들 중의 하나로 간주되기 때문에, 서울대에만 국가가 모든 지원을 몰아주기 힘든 상황에 처해 있습니다. 
  이보다 더 중요한 양자의 차이는 교수사회의 권력구조에서 나타납니다. 싱가포르 국립대학은 2000년대 초반까지도 교수정년이 55세였고, 이것이 대학의 구조조정에 매우 긍정적인 역할을 하였습니다. 젊고 열정 넘치는 교수들이 대학사회의 다수를 차지하면서, 이미 법인화 이전에 싱가포르 국립대학의 교육과 연구수준은 세계적 수준에 오를 수 있었습니다. 다시 말하면 법인화로 인해 싱가포르 국립대학의 경쟁력이 향상된 것이 아니라, 대학 내 교수사회의 권력구조의 변화와 그로 인한 건전한 지식공동체의 생성이 이루어졌기 때문에 싱가포르 국립대학의 경쟁력이 향상될 수 있었던 것입니다. 이러한 환경의 차이 외에도 영어권 국가로서 싱가포르가 가지는 문화적 경쟁력 등도 싱가포르 국립대학의 세계화와 경쟁력 향상에 매우 중요한 조건이었습니다. 따라서 법인화가 경쟁력 향상의 원인이었다고 보는 것은 껍질만 보는 태도입니다. 

질문 4. 
  법인화되면 서울대는 다른 사립대하고 같아지나요? 시간강사 등 비정규 교수들 처우가 개선되고 학생들은 학비 부담을 덜게 되는지요?
=> 서울대가 법인화되면 국립대로서의 정체성은 매우 약해집니다. 처우개선이나 등록금 문제는 학교의 재정능력과 관련된 문제입니다. 법인화를 한다고 하여 국가의 재정지원이 당장에 약화되지는 않겠지만 장기적으로 교직원의 처우를 개선하려면 사실상 등록금 인상 이외에는 확실한 방도가 없습니다. 재정확보로는 국고지원, 기성회회계, 연구비, 기부금, 수익사업이 있는데, 기성회회계를 제외하고 획기적으로 재원을 늘릴 수 있는 길은 없습니다. 

질문 5. 
  서울대 법인화는 이명박정부에서 통과되었지만, 김대중, 노무현 정부에서도 꾸준히 추진되었는데, 어차피 '법인화'라고 하는 대세는 거스를 수 없지 않나요? 통과된 법안에 일부 문제가 있다면 수정하면 되는 것이지, 법인화 자체를 반대하는 것은 설득력이 떨어지지 않나요?
=> 법인화가 대세라는 데 동의하지 않습니다. 일본 국립대는 법인화되었지만, 대만은 결국 법인화를 포기했고 중국은 대학개혁이 있었지만 미국대학 식의 지배구조를 도입하지 않았습니다. 유럽은 일부가 법인화되었지만 그것은 별도의 공익형 법인입니다. 문제는 법인화를 하는 정부당국의 의도입니다. 전 세계에서 사립대학의 비중이 가장 높고 고등교육의 재원 가운데 국고의 비중이 OECD 국가 가운데 가장 낮고(GDP 대비 0.5%), 등록금의 액수가 미국 다음이고 GDP 대비로는 세계 최고인 우리나라에서 법인화는 대학경쟁력을 키우기는커녕 서울대가 60여년에 거쳐 쌓아온 교육 및 연구역량을 오히려 약화시킬 것입니다.
  우리나라에서 중등교육 분야에 대해서는 평준화가 우선이냐, 수월성이 우선이냐를 놓고 정치세력과 사회주체들이 많은 논쟁을 해 왔지만, 고등교육의 방향성과 가치에 대해서는 한번도 사회적·정치적 논쟁이 진지하게 이루어지지 못했습니다. 교육은 오로지 학생들을 대학에 입학시키는 문제로만 생각해 오다 보니, 입학 이후의 대학 교육이, 그리고 대학에서 이루어지는 학문이 어떠한 방향성을 가져야 하고, 어떠한 가치를 지향해야 하는지에 대해서 정치세력과 사회주체들이 충분한 관심을 기울여오지 않았던 것입니다. 
  법인화가 대세라는 믿음은 이러한 상황 속에서 만들어 진 것입니다. 사회·정치적 관심이 부족한 상황에서 교과부를 중심으로 한 일부 세력들이 신자유주의적 믿음을 바탕으로 법인화만이 살 길이라는 담론을 만들어내고 유포시킨 것입니다. 물론 이러한 과정은 대학교수집단에 대한 국민들의 불신을 바탕으로 하고 있다는 사실을 인정해야 합니다. 권위주의와 보신주의에 물든 교수들을 기득권 세력으로 바라보는 국민들의 정서를 법인화 논리가 잘 이용하고 있다고 생각합니다. 기존 교수집단의 부정적인 모습은 반드시 바뀌어야 합니다. 하지만 그 방법이 법인화여야 한다는 주장에는 동의할 수 없습니다. 


질문 6. 
  이 문제와 관련하여 서울대의 3대 주체인 교수, 교직원, 학생들의 여론은 어떻습니까?
=> 교수 집단은 크게 세 부류로 나눌 수 있습니다. 법인화는 찬성하지만 이번에 통과된 법인화법안에는 반대하는 측(교수협의회가 대표함), 통과된 법인화법에 찬성하는 측(대학본부가 대표함), 법인화 자체를 반대하는 측(공대위가 대표함). 하지만 교수들의 의견을 물어본 적이 없기에 분포를 정확하게 말할 수는 없습니다. 
  교직원은 자체 여론조사를 통해 60% 정도가, 학생들은 80% 정도가 반대합니다. 사실 법인화와 관련한 논의는 잘 진행되었더라면 서울대 발전을 위한 좋은 기회가 되었을 것입니다. 서울대가 건교 60돌을 맞아 자기점검을 통해 발전의 방향과 계기를 모색하여 학내 구성원 사이에 합의를 만들어 갔더라면 새로운 60년을 위한 도약의 발판을 만들었을 것입니다. 하지만 본부는 법인화라는 답안을 미리 만들어 놓고 그런 논의과정 자체를 봉쇄했습니다.

<자율성 문제>

질문 7. 
  법인이 되면 의사결정의 최고기구는 이사회일 텐데, 법인화 이전의 학교운영 주체들이 모두 참여할 기회가 주어지나요?
=> 그렇지 않습니다. 사실 국립대라는 것은 사단적 성격을 갖기 마련이어서 대학 자치를 보듬는 장치가 부족하더라도 기본적으로 그 구성원들이 학교의 주인이라고 할 수 있습니다. 하지만 법인화가 되면 재단적 성격을 갖게 되어 제도적 장치가 갖춰지지 않으면 구성원들이 학교운영에 참여할 기회는 제한적입니다. 이번의 ‘서울대 법인화법’에는 학생의 참여를 위한 규정은 아예 없고, 교직원의 경우도 주변적입니다. 이는 결국 정관을 만드는 과정에서 반영되어야 할 것입니다. 참고로 일본은 법인화를 했습니다만 총장직선제는 그대로 살아 있습니다. 

질문 8. 
  지금처럼 교수만 총장 선출에 투표권을 갖고 교직원, 학생의 참여가 보장되지 않는 직선제는 문제가 있다고 봅니다. 서울대가 법인화되면 총장선출은 누가 하게 되나요? 이사회가 교수, 교직원, 학생의 의견을 잘 수렴해서 능력있는 총장을 선임하는 것이 더 낫지 않나요? 
=> 현행의 총장직선제에는 교수만이 아니고 직원들도 참여하고 있습니다만, 대표성이 낮습니다. 학생은 배제되고 있고요. ‘서울대 법인화법’에는 ‘총장은 총장추천위원회가 추천한 후보자 중에서 이사회가 선출하여 교과부장관의 제청으로 대통령이 임명한다’(제7조 1항)고 되어 있습니다. 총장직선제를 얼마든지 살릴 수 있는 규정입니다. 이사회가 학내 구성원들의 의견을 가장 잘 수렴할 수 있는 방안이 바로 총장직선제입니다. 이사회의 권한과 총장직선제를 잘 결합시키는 방안 역시 정관을 만들면서 해결하여야 할 문제입니다.

질문 9. 
  법인화를 하면 국가공무원에 관련한 법령에 얽매이지 않고, 조직의 구성, 운영 등에 있어서 자율성을 확보할 수 있는 것 아닌가요?
=> 애초 찬성론자들이 법인화를 하면 대학의 자율성이 커진다고 했을 때, 그 핵심적인 내용은 총장이 직원인사권과 예산편성권을 갖게 된다는 점이었습니다. 이 점에서 행정의 유연성이 커지는 측면이 있습니다. 하지만 이 자율성은 철저하게 대학의 구성원과는 무관한 총장의 자율성에 불과합니다. 
  더욱이 이사회에 교과부차관과 기재부차관이 들어오고 모든 중요한 사항에 대해 교과부장관이 승인 및 추천권을 갖고 있고 또 대학운영에 대한 평가를 매년 하는 상황에서 예컨대 사무국장을 과연 총장이 마음대로 인사할 수 있을는지, 그리고 예산편성권이라는 것이 참으로 자율적으로 행해질 수 있을는지 의문입니다. 
  대학의 운영과 조직구성 등에서의 자율성이 높아지는 것은 매우 중요하고, 이는 법인화 반대 측에서도 인정하는 바입니다. 하지만, 그러한 자율성의 증진이 법인화를 통해서만 이루어질 수 있는 것은 아닙니다. 예를 들어, ‘고등교육법’의 개정을 통해 국립대학이 예산집행, 운영, 조직구성 등에서 자율성을 가지도록 만들 수도 있습니다. 
  구체적인 예로, 현재 개별 사업별로 정부의 예산을 지원받는 방식에서 포괄적 재정지원 방식으로만 바뀌어도 서울대의 자율성은 급격히 높아질 수 있고, 이를 통해 같은 재원으로 훨씬 효율적인 배분이 가능합니다. 하지만, 교과부나 관련 정부 부처가 자신들의 대학 지배력을 잃지 않기 위해 포괄적 재정지원을 거부하고 있는 겁니다.  

질문 10. 
  서울대가 법인으로 바뀌면 교육과 연구의 자율성이 높아지는 거 아닌가요? 특히 경쟁 체제의 도입과 업적주의에 따른 보상이 더욱 필요하지 않습니까?
=> 법인화의 핵심은 대학지배구조의 변경에 있기에 그것과 교육 및 연구의 자율성과는 직접적인 관련이 없습니다. 하지만 법인화로 대학에 대한 자본과 기업의 요구가 커질 가능성이 농후하기에 교육 및 학문의 자율성이 침해받을 여지는 그만큼 커집니다. 대학이 기업과 국가의 도움도 받고 또 국가와 기업의 발전에 기여해야 합니다만, 그것들과 다른 존재이유가 있는 것입니다. 최근의 연구는 경쟁체제가 일정 수준을 넘어서면 효율성을 보장하기는커녕 오히려 역효과를 내게 마련임을 보입니다. 대학은 ‘철밥통’이기는커녕 이미 경쟁이 너무 많은 상태입니다.
  그렇다고 경쟁의 긍정적 측면을 무시하는 것은 아닙니다. 경쟁과 업적주의에 따른 보상은 교수를 긴장하게 만들고 학문과 교육활동에 대한 동기유발을 촉진할 수 있습니다. 하지만 경쟁은 효율성을 감소시키는 역효과를 만들어내기도 하고, 시장적 방식의 경쟁을 통해 학문과 교육의 상품화를 초래할 수도 있습니다. 더욱 심각한 것은 법인화로 인해 교수, 학생, 교직원들이 학문과 교육 활동의 질적 향상을 위한 경쟁보다는 각종 재원을 끌어오기 위한 정치적 로비의 경쟁에 내몰릴 가능성이 훨씬 커진다는 사실입니다. 이는 일본의 법인화 사례에서도 잘 나타나는데, 법인화 이후 일본의 대학 교수들은 연구 활동보다 각종 보고서 및 서류 작성에 더 많은 시간을 낭비하게 되었다는 보고가 있기도 합니다. 
  다시 말해, 우리는 대학 사회에서 경쟁이 높아지는 것을 절대로 두려워해서는 안 되지만, 동시에 어떠한 경쟁이 우리에게 필요한지 심각하게 고민해야 합니다. 과연 법인화가 우리 대학사회를 긍정적인 방향으로 개혁할 ‘건강한 경쟁’을 촉진할 것인지, 아니면 그 이전에 이미 우리 대학사회를 좀 먹었던 부정적인 모습의 경쟁을 더욱 더 강화할 것인지, 신중하게 생각해 봐야 합니다. 

<공공성 문제>

질문 11. 
  서울대 법인화에 반대하는 것은 그동안 서울대가 누렸던 기득권이 흔들리는 것을 우려해서는 아닌가요? 날치기 통과된 법안을 폐지하는 것이 대학 교육의 공공성을 회복하고 사회적 공정성에 대한 무력감과 자포자기를 극복하는 데 어떤 도움을 줄 수 있을까요?  
=>  높은 대학 교육을 받을 수 있는 기회는 질 높은 삶을 살 수 있는 가능성으로 이어집니다. 따라서 고등교육의 기회가 모든 국민에게 공평하게 주어져야 한다는 것은 공정한 사회에 대한 최소한의 국민적 합의이며 공감대일 것입니다. 하지만 한국에서 질 높은 대학 교육이 일부 계층의 전유물이 되어버린 지 오래라는 사회적 무력감과 자포자기가 서울대 법인화에 대한 냉소적인 태도로 표현되는 것 같습니다. 이 무력감은 특히 1990년대 이후 급격히 사회적으로 확대되었습니다. 이러한 현상의 근저에는 여러 가지 이유가 있겠지만, 고등교육에 대한 정부의 책임방기가 매우 큰 원인이라고 생각합니다. 앞에서도 여러 차례 지적했듯이, 우리나라에서 고등교육에 대한 국가재정의 기여는 전세계적으로 매우 낮은 수치입니다. 이 부분이 획기적으로 개선되지 않고는 고등교육의 사회적 공공성은 실현되기 힘들 것입니다.
 우리나라는 사립대학의 비중이 전 세계에서 가장 높기에, 국립대학은 교육의 공공성을 지켜주는 버팀목입니다. 그것은 양질의 고등교육을 모두에게 제공하여 교육의 기회균등을 실현하고 공평한 사회의 초석을 놓습니다. 그런데 이미 우리 국립대학의 등록금은 상대적으로나 절대적으로나 세계 최고 수준입니다. 이런 상황에서 법인화란 사실상 국가가 고등교육을 방기하고 시장논리에 맡기는 것을 말합니다. 그리고 이것은 교육의 공공성을 근저로부터 무너뜨릴 것입니다.

질문 12. 
  산학협동 등 기업이 대학운영에 기여할 수 있도록 해야 대학재정은 물론 산학협력도 강화되고, 국가 경제발전에도 긍정적인 영향을 줄 수 있지 않을까요?
=> 물론 기업은 대학에 도움을 줄 수 있고 대학 역시 기업의 발전에도 기여해야 합니다. 그리고 이미 우리의 대학에는 산학협동이 깊숙이 자리잡고 있습니다. 하지만 이는 어디까지나 대학의 독자성이 유지되는 한에서만 허용되어야 할 일입니다. 대학의 존재이유는 근본적으로 학문의 교육과 연구를 통해 한 사회의 자기성찰능력을 함양하는데 있습니다. 지성은 자본이나 권력과 마찬가지로 고유한 존재영역이 있는 것입니다. 그리고 이런 성찰력이 발휘될 때 미연의 사회적 비용을 줄일 수 있으며, 이는 우회적이지만 기업 못지않게 확실한 방식으로 사회 및 국가 발전에 기여하는 것입니다.

<국제경쟁력 문제>

질문 13.
  서울대가 국내 1위이지만, 세계 대학순위에서는 하위권에 머물고 있는데, 법인화나 뭔가 큰 변화가 있어야 서울대의 세계화도 가능하지 않을까요?
=> 먼저 대학의 순위가 기만적이라는 점에 유의해야 합니다. 이른바 100위 안에 독일이나 프랑스의 대학은 거의 보이지 않습니다만, 그렇다고 이 두 나라의 학문이 세계적인 경쟁력이 없다고 말하긴 어렵습니다. 사실 서울대가 40위권이라고 하는데, 주어지는 재정에 비한다면 그렇게 나쁜 성적도 아닙니다. 하지만 분명 서울대가 행복한 상태가 아닌 것만은 분명합니다. 건교 60돌을 지나면서 21세기에 걸맞은 발전의 새 계기를 마련해야 합니다. 하지만 과연 법인화가 유일한 대안인지는 명확치 않습니다. 
  대학의 경쟁력은 해외 학술지 출판 논문 편수, 노벨상 개수, 대학의 연구비 수주 액수 등과 같은 지표로 쉽사리 평가될 수 있는 것이 아닙니다. 그러한 정량적 수치보다도 어떤 대학에서, 혹은 어떤 국가의 대학 사회에서, 건전한 “지식공동체”와 “지식생태계”가 살아있는지, 그 지식공동체가 얼마나 역동적인지와 같은 정성적인 요소가 대학의 경쟁력을 평가하는데 훨씬 중요하다 생각합니다. 얼마 전 여러 언론에서 지적되었듯이, 현재 서울대의 “지식공동체”는 사라지고 없습니다. 그런데 이러한 지식공동체의 복원이 법인화를 통해 가능할까요? 앞서 지적하였듯이, 법인화는 서울대의 교수, 학생, 교직원들을 정치적 로비의 경쟁으로 강하게 내몰아, 지식공동체의 말살을 더욱 가속화하는 역할을 할 것입니다. 


질문 14. 
  서울대 법인화를 지지하는 주된 주장은 대학 경쟁력 강화입니다.  그렇다면 대학의 경쟁력이란 구체적으로 어떤 지표로 계산되고 있는지 또 어떤 지표들이 고려되어야 하는지요? (대학의 경쟁력이 교수들의 연구 성과나 실적으로 평가되는 것은 오히려 교육의 수준과 질을 떨어뜨리는 결과를 가져올 수도 있습니다. 교수들의 연구 성과나 실적 이외에 학생들이 구체적으로 경험하는 교육의 질과 대학생활 만족도, 대학생들의 사회적 기여와 봉사 등도 수준 높은 명문대학의 평가 기준이 되어야 한다고 봅니다.) 
=>  대학의 경쟁력이란 과연 그 대학이 건전한 “지식공동체”와 “지식생태계”를 바탕으로 학문을 재생산할 수 있는 역량과 토대를 갖고 있느냐의 문제입니다. 서울대와 한국의 대학 사회는 그간 교육 및 연구 역량이 비약적으로 성장했습니다만, 자생적 기반을 아직 만들어내지 못하고 있습니다. 교수와 학부생은 우수합니다만, 중간허리, 곧 대학원이 부실합니다. 그러기에 특히 미국대학에 학문적으로 종속되어 있습니다. 독자적인 축적기반을 갖추고 있지 못합니다. 독일이나 프랑스가 100위권 대학이 거의 없으면서도 세계적인 수준으로 독자적인 학문세계를  꾸리고 있음에 유의해야 합니다. 이는 결국 학문이 한 대학의 차원에서 이룩될 수 있는 것이 아님을 웅변합니다. 그러기에 서울대의 법인화는 국립대학체계 전반을 보지 못하고 특권의식과 이기주의에 함몰된 단견인 것입니다. 

질문 15.
  법인화를 하면 더 이상 공무원 조직이 아니라 공기업처럼 되는 것일 텐데요, 그러면 일반적으로 알려진 공무원 조직의 비효율성, 관료적 폐해 등이 개선되는 건 아닐까요?
=> 흔히 현재 서울대의 교육행정이 비효율적이고 높은 수준의 서비스를 제공하지 못한다고 말합니다. 그리고 법인화 찬성론자들은 이것을 경직된 국립대 탓으로 돌립니다. 하지만 꼭 그렇지 않습니다. 오히려 보직교수의 수가 너무 많아, 직원들의 교육행정의 전문화를 막고 있다고 판단됩니다. 바꿔 말하면, 교수들의 보직 선호가 학문의 발전을 억제하고 대학의 자치를 보듬어 내지 못할 뿐만 아니라, 서울대 교육행정조직의 효율성과 전문성을 약화시키고 있는 것입니다. 

<재정 및 조직 문제>

질문 16. 
  서울대가 법인화되면 교수님들의 신분은 어떻게 변경되나요? 교수님들의 연봉은 명문 사립대와 비슷해지나요? 
=> 교수들의 경우, 법인화되면 ‘5년간 공무원 신분을 보유하나’ 그 이후에는 법인의 피고용인이 됩니다. 연금은 법인화가 된 이후 20년까지는 ‘공무원연금법’의, 이후에는 ‘사립학교교직원 연금법’의 적용을 받습니다. 법인화된 이후에 신규 채용되는 교·직원은 모두 ‘사립학교교직원 연금법’의 적용을 받습니다. 
  직원의 경우 공무원은 법인화의 시점에서 서울대의 직원으로 임용될 것을 희망하면 공무원에서 퇴직하고 법인의 직원이 되고, 기성회직은 법인화와 더불어 퇴직하는 것으로 간주하여 고용승계가 되면 신규 채용되는 셈입니다. 많은 교수들이 법인화되면 봉급이 오를 것으로 기대하나 서울대의 재정구조로 보아 등록금이 크게 오르지 않는 한 명문 사립대 수준이 될 가능성은 거의 없습니다. 

질문 17. 
  한국은 OECD 국가 중 대학재정에서 정부지원 비율이 가장 낮은 나라로 알고 있습니다. 이런 상황에서 서울대를 비롯한 모든 국립대학이 법인화된다면 정부지원 비율이 더 낮아지는 것은 아닌지요? 그렇다면 대학의 경쟁력을 유지하기 위해 필요한 재원은 어디서 어떻게 확보될 수 있습니까? 
=> 대학재정에서 정부지원 비율은 OECD 국가의 평균이 GDP 대비 1.0%이나 우리나라는 0.5%에 불과합니다. 그러니까 우리나라는 정부지원의 여력이 충분한 편입니다. 하지만 현재 정부는 그런 투자를 기피하고 국립대의 법인화를 꾀하고 있습니다. 40개에 달하는 모든 국립대학이 법인화하지는 않을 것입니다. 법인화하여 살아남을 수 있다고 여기는 대학은 기껏 몇 개에 불과합니다. 
  연구비, 기부금, 수익사업의 수익금 등이 획기적으로 늘 가능성은 거의 없습니다. 이런 상황에서 국고지원이 획기적으로 늘지 않는 한 사실 등록금 이외에 재원 확보의 뾰족한 방안은 없습니다.

질문 18. 
  서울대에 대한 정부의 지원이 타 국립대에 비해 월등했던 것으로 아는데 법인화 반대는 국가 지원이라는 바람막이가 없어지리라는 불안감 때문이 아닌지요?
=> 다른 국립대에 비해 서울대가 우월적인 지위에서 국가의 지원을 많이 받은 것은 사실입니다. 국립대학체계 전반의 개선이라는 관점에서 이 부분은 고쳐질 필요가 있습니다. 서울대 뿐 아니라, 여러 지역의 거점 국립대학의 균형있는 성장과 발전이 필요합니다. 이를 위해서, 고등교육 전반에 대한 국가의 지원 그 자체는 더욱 더 늘어나야 합니다. 고등교육을 발전시키는 것은 일부 특권층 자녀에 대한 교육의 문제가 아니라, 국가공동체 전체의 이익과 관련되기 때문입니다. 그런데 현재 정부가 추진하는 법인화는 서울대의 우월적 지위도 그대로 유지하면서, 고등교육에 대한 국가의 지원도 줄이겠다는 것입니다. 
  서울대에서 법인화 추진론자들은 내심 법인화하면 정부의 재정적 특혜가 주어지리라고 기대했습니다. 하지만 통과된 법안을 보면 법인화 이전과 이후에 재정지원 면에서 어떤 근본적인 차이가 보이지 않습니다. 솔직히 법인화된다고 하여 재정지원의 어떤 두드러진 추세 변화가 있을 것으로 보지 않습니다. 그렇기에 장기적으로 등록금 인상이 불가피하다고 보는 것입니다. 

질문 19. 
  서울대 등록금 수준이 일반 사립대와 비교하면 어떤가요? 
=> 현재 서울대의 등록금은 단과대학에 따라 차이를 보이지만 대략 명문 사립대에 비해 2/3정도 됩니다. 그러나 지방 국립대에 비하면 이미 연 200만원정도 많습니다. 올해 서울대는 등록금을 동결시켰지만, 법인이 되면 장기적으로 등록금은 올라갈 것으로 예상됩니다. 그리고 이는 사립대가 등록금을 올리는 것을 용이하게 만들 것입니다. 그러니까 사학재단은 서울대 법인화의 간접적인 수혜자입니다. 이것이 우리 고등교육의 공공성을 해쳐 기회균등이라는 최소한의 공평성을 무너뜨릴 것이 너무도 자명합니다. 

질문 20.
  법인화가 되면 재정을 확보하는데 좀 더 다양한 방법을 동원할 수 있지 않을까요?
=> 다양한 방법이 동원될 것입니다. 당장에 학내의 여러 편의시설에 대한 임대료가 인상이 될 것입니다. 당연히 그 부담은 고스란히 교수와 특히 학생들에게 돌아갈 것입니다. 수익사업에도 열을 올릴 것입니다. 하지만 대학이 수익사업에서 몫돈을 마련한 예는 미국에서도 발견하기 어렵습니다. 이런 방안들은 대학에 이렇다 할 수익은 가져다주지 못하면서도 대학을 기업화하는 데에는 큰 영향을 미칠 것입니다.

<고등교육과 대안>

질문 21.
  서울대가 법인화되면 전국의 모든 국립대학이 곧 법인화의 길로 들어설 것 같습니다. 그렇다면 법인화의 구체적인 추진 내용에서 서울대와 지방 국립대학 간에 차별이 발생할 소지는 없는지요?
=> 정부는 ‘선택적 법인화’를 추진하고 있고 그나마 여건이 낫다는 9개 거점대학 가운데 많아야 4개 정도가 추진을 시도할 것입니다. 이는 당장에는 해당 대학에 엄청난 갈등을 부를 것입니다. 국고지원이 획기적으로 늘지 않는 한 법인화 대학이 좀 더 많은 지원을 받으면 나머지 국립대학들은 파국을 맞이할 것이고, 그렇지 않다면 법인화 대학들은 역시 등록금을 올리는 것 이외에 대안이 없을 것입니다. 서울대가 시장구조에서 자체 경쟁력을 확보할 지도 미지수지만, 지방 국립대는 참으로 이러지도 저러지도 못하는 상황에 처해 있습니다. 

질문 22. 
  미국과 일본의 교육 체제가 한국이 지향해야 할 유일한 모범은 아니라고 생각합니다. 혹시 유럽의 대학들 중 우리가 따라 배울만한 모범적 모형은 없는지요?
=> 미국에서는 모든 대학이 다 법인이사회의 지배구조를 갖고 있지만 우리의 사립대와 같은 특정인의 소유물로 간주되는 천박한 대학관은 거의 사라졌습니다. 예컨대 인디애나 주의 퍼듀 대학처럼 오히려 주가 재정난에 처한 사립대학을 인수한 바 있습니다. 일본은 2004년에 모든 국립대를 법인화했습니다만, 대학의 지배구조는 굳건하게 내부자 중심입니다. 
  유럽에는 사립대학이란 개념 자체가 없습니다. 법인이라고 하더라도 독일의 괴팅겐 대학처럼 기본적으로 ‘공익형 재단’입니다. 영국을 제외하고는 최근 등록금을 조금씩 늘려가고 있지만 그 액수가 일 년에 기껏 몇 십만 원을 넘지 않습니다. 서울대 교수협의회는 ‘괴팅겐대학을 중심으로 주정부의 직접적 관할에서 벗어나서 대학의 자율성은 보장하되 주정부의 재정적 지원 보장 등 국립대학의 지위를 유지하는 공법상의 재단대학 형태로 전환하는 사례’를 모범적 모형으로 제시한 바 있습니다. 

질문 23.
  법인화를 반대한다면 그 대안으로 현재의 서울대법 체제를 계속 유지하겠다는 건가요? 만약 그렇다면  현재 체제에 있는 여러 가지 문제점 등에는 어떤 대안이 있습니까? 
=> 서울대 법인화가 폐기된다면, 서울대가 이전의 ‘설치령 체제’로 그대로 돌아갈 수는 없을 것입니다. 다른 국립대학, 특히 유수한 거점 국립대와의 연계를 통해 국립대학체제를 강화해야 할 것입니다. 공동입시안을 꾸려 사교육비의 부담을 줄이는 한편, 대학원의 강화를 통해 지식공동체의 재건을 꾀해야 할 것입니다. 보직의 수를 과감히 줄여 ‘연구대학’에 걸맞은 면모를 갖춰야 합니다. 
  더 근본적으로 학문의 독자적 재생산의 토대를 마련하기 위해 교수충원에서 자충율을 대폭 낮추고 다양한 통로를 마련하여 학풍을 일신해야 합니다. 서울대는 철저한 자기혁신의 기반 위에서 국민에게 대학발전에 필요한 재정지원을 요청해야 할 것입니다.

질문 24. 
  서울대 법인화에 문제가 많다면 왜 서울대 교수님들의 반대 목소리가 높지 않습니까? 
=> 대학은 일반 사회와 다릅니다. 사회는 언제나 이해관계가 충돌하는 곳이기에 문제가 발생하면 파열음이 들리기 마련입니다. 하지만 대학은 교육과 연구 그리고 이를 뒷받침하는 행정이 주요활동이기에 여기서는 갈등이 표출되지 않습니다. 대학에 자치를 위한 소통구조가 제도적으로 마련되어야 하는 이유가 여기에 있습니다. 
  서울대 내부에서 대의기구라고 할 수 있는 것으로 대학평의원회가 있습니다만, 대학본부에 사실상 예속되어 있습니다. 모든 교수가 회원으로 들어와 있는 교수협의회가 임의기구로서 있습니다만, 법인화 자체는 반대하지 않고 다만 이번에 통과된 법안에 대해서는 반대의사를 표명했습니다. 더 근본적으로 서울대 교수들이 대체적으로 우리 고등교육 전반이나 다른 국립대학의 실상을 고민하지 않은 채 내 알 바가 아니라는 이기적인 태도에 빠져 있기 때문입니다. 최근 들어 국립대학의 정체성을 급속하게 상실해가고 있음도 또 다른 요인입니다.

질문 25. 
  서울대 동문들이 법인화 반대운동에 어떤 지원활동을 하면 도움이 될까요?
=> ‘대학 문제’하면 주로 입시나 취업의 시각에서 접근하는 것이 추세인 듯 보입니다. 법인화가 대학의 기업화, 기초학문의 약화, 지방 국립대의 고사, 노동유연화, 등록금의 인상, 교육공공성의 약화 등을 초래할 것이 거의 명백합니다만, 그래도 그것이 우리 대학의 국제경쟁력을 높인다면 그 나름의 정당성을 가질 것입니다. 과연 그러한지 본질적인 문제에 바싹 다가가 검토해 주시기 바랍니다. 우리 사회 일반에 서울대문제의 본질을 알리는 작업을 해주셨으면 합니다. 

반응형
AND

ARCHIVE

CALENDAR

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

RECENT TRACKBACK

RECENT COMMENT

RECENT ARTICLE

ARTICLE CATEGORY

분류 전체보기 (175)
가족일기 (3)
낙서장 (39)
밥벌이 (30)
추억 (6)
사회 (27)
혼자만의 방 (2)
생태 (4)
눈여겨 보는 곳 (1)
어머니 일기 (38)
윤선애 (1)
생활 단식 (11)
동거동락 자전거 (2)
반응형